天天看點

ListView中條目指定位置停留和動畫效果

最近檢視主流app練習時遇到了個挺蛋疼的布局實作,一個可以上下滑動布局滑動到指定條目時,這個條目在頂部停下來下面的條目還可以繼續滑動,
 
 
  于是照貓畫虎的自己寫了個實作,當指定一個位置停留時想清除了需求其實很簡單,當條目位置确定是置頂後用另一個長相相同和這個條目相同的View覆寫就可以了.畢竟小弟剛學,對自定義控件不是特别熟練,就用了個特簡單的方法實作.
 
 
  //布局
 
 
  <?
  xml 
  version
  =
  "1.0" 
  encoding
  =
  "utf-8"
  ?>
 
 
  <
  RelativeLayout 
  xmlns:
  android
  =
  "http://schemas.android.com/apk/res/android"
 
     
  android:
  layout_width
  =
  "match_parent"
 
     
  android:
  layout_height
  =
  "match_parent"
 
     
  >
 
    
 
     
  <
  ListView 
 
         
  android:
  id
  =
  "@+id/lv_demo"
 
         
  android:
  layout_width
  =
  "match_parent"
 
         
  android:
  layout_height
  =
  "wrap_content"
 
         
 
         
  />
 
  
  <
  TextView 
 
      
  android:
  background
  =
  "#fff"
 
         
  android:
  id
  =
  "@+id/tv_listdemo"
 
         
  android:
  layout_width
  =
  "match_parent"
 
         
  android:
  layout_height
  =
  "wrap_content"
 
         
  android:
  text
  =
  "條目1"
 
         
  android:
  visibility
  =
  "invisible"
 
         
  />
 
 
  </
  RelativeLayout
  >
 
 
  import 
  java.util.ArrayList
  ;
 
 
  import 
  java.util.List
  ;
 
 
  

 
 
  import 
  android.app.Activity
  ;
 
 
  import 
  android.os.Bundle
  ;
 
 
  import 
  android.util.DisplayMetrics
  ;
 
 
  import 
  android.view.View
  ;
 
 
  import 
  android.view.ViewGroup
  ;
 
 
  import 
  android.view.animation.Animation
  ;
 
 
  import 
  android.view.animation.Animation.AnimationListener
  ;
 
 
  import 
  android.view.animation.TranslateAnimation
  ;
 
 
  import 
  android.widget.AbsListView
  ;
 
 
  import 
  android.widget.AbsListView.OnScrollListener
  ;
 
 
  import 
  android.widget.AdapterView
  ;
 
 
  import 
  android.widget.AdapterView.OnItemClickListener
  ;
 
 
  import 
  android.widget.BaseAdapter
  ;
 
 
  import 
  android.widget.ListView
  ;
 
 
  import 
  android.widget.TextView
  ;
 
 
  

 
 
  public 
  class 
  ListViewDemo 
  extends 
  Activity 
  {
 
 	
  private 
  ListView 
  lv
  ;
 
 	
  private 
  List
  <
  String
  > 
  list
  ;
 
 	
  private 
  TextView 
  tv_demo
  ;
 
 	
  private 
  MyBaseAdapter 
  adapter
  ;
 
 
  

 
 	
  @Override
 
 	
  protected 
  void 
  onCreate
  (
  Bundle 
  savedInstanceState
  ) 
  {
 
 		
  // TODO Auto-generated method stub
 
 		
  super
  .
  onCreate
  (
  savedInstanceState
  );
 
 		
  setContentView
  (
  R
  .
  layout
  .
  listdemo
  );
 
 		
  initView
  ();
 
 		
  initData
  ();
 
 		
  initLinter
  ();
 
 	
  }
 
 
  /**
 
 
   * 監聽
 
 
   * */
 
 	
  private 
  void 
  initLinter
  () 
  {
 
 		
  //滑動監聽
 
 		
  lv
  .
  setOnScrollListener
  (
  new 
  OnScrollListener
  () 
  {
 
 			
 
 			
  @Override
 
 			
  public 
  void 
  onScrollStateChanged
  (
  AbsListView 
  view
  , 
  int 
  scrollState
  ) 
  {
 
 				
  // TODO Auto-generated method stub
 
 				
 
 			
  }
 
 			
 
 			
  @Override
 
 			
  public 
  void 
  onScroll
  (
  AbsListView 
  view
  , 
  int 
  firstVisibleItem
  ,
 
 					
  int 
  visibleItemCount
  , 
  int 
  totalItemCount
  ) 
  {
 
 				
  //當出現在指定位置為1時顯示出來
 
 				
  if
  (
  firstVisibleItem
  ==
  1
  ){
 
 					
  tv_demo
  .
  setVisibility
  (
  View
  .
  VISIBLE
  );
 
 				
  }
  else 
  if
  (
  firstVisibleItem
  <
  1
  ){
 
 					
  tv_demo
  .
  setVisibility
  (
  View
  .
  GONE
  );
 
 				
  }
 
 				
 
 			
  }
 
 		
  });
 
 		
  //條目監聽
 
 		
  lv
  .
  setOnItemClickListener
  (
  new 
  OnItemClickListener
  () 
  {
 
 
  

 
 			
  @Override
 
 			
  public 
  void 
  onItemClick
  (
  AdapterView
  <?> 
  parent
  , 
  View 
  view
  ,
 
 					
  int 
  position
  , 
  long 
  id
  ) 
  {
 
 				
  int 
  id2 
  = 
  lv
  .
  getSelectedItemPosition
  ();
 
 				
  System
  .
  out
  .
  println
  (
  id2
  );
 
 				
  if
  (
  position
  >
  1
  ){
 
 				
  //過時的方法
 
 				
  //int i = getWindowManager().getDefaultDisplay().getWidth();
 
 				
  //替代方法:通過擷取分辨率資訊來過去寬度
 
 				
  DisplayMetrics 
  metrics 
  = 
  new 
  DisplayMetrics
  ();
 
 				
  getWindowManager
  ().
  getDefaultDisplay
  ().
  getMetrics
  (
  metrics
  );
 
 				
  int 
  i 
  = 
  metrics
  .
  widthPixels
  ;
 
 				
  //從左側移動到最右側
 
 				
  TranslateAnimation 
  animation 
  = 
  new 
  TranslateAnimation
  (
  0
  , 
  i
  , 
  0
  , 
  0
  );
 
 				
  animation
  .
  setDuration
  (
  500
  );
 
 				
  view
  .
  startAnimation
  (
  animation
  );
 
 				
  final 
  int 
  state 
  = 
  position
  ;
 
 				
  //動畫監聽
 
 				
  animation
  .
  setAnimationListener
  (
  new 
  AnimationListener
  () 
  {
 
 					
 
 					
  @Override
 
 					
  public 
  void 
  onAnimationStart
  (
  Animation 
  animation
  ) 
  {
 
 						
  // TODO Auto-generated method stub
 
 						
 
 					
  }
 
 					
 
 					
  @Override
 
 					
  public 
  void 
  onAnimationRepeat
  (
  Animation 
  animation
  ) 
  {
 
 						
  // TODO Auto-generated method stub
 
 						
 
 					
  }
 
 					
  //動畫結束
 
 					
  @Override
 
 					
  public 
  void 
  onAnimationEnd
  (
  Animation 
  animation
  ) 
  {
 
 						
  //删除標明條目
 
 						
  list
  .
  remove
  (
  list
  .
  get
  (
  state
  ));
 
 						
  //更新填充
 
 						
  adapter
  .
  notifyDataSetChanged
  ();
 
 					
  }
 
 				
  });
 
 				
 
 				
  }
 
 			
  }
 
 		
  });
 
 	
  }
 
 
  /**
 
 
   * 資料填充
 
 
   * */
 
 	
  private 
  void 
  initData
  () 
  {
 
 		
  list 
  = 
  new 
  ArrayList
  <
  String
  >();
 
 		
  for 
  (
  int 
  i 
  = 
  0
  ; 
  i 
  < 
  50
  ; 
  i
  ++) 
  {
 
 			
  list
  .
  add
  (
  "條目"
  +
  i
  );
 
 		
  }
 
 		
  adapter 
  = 
  new 
  MyBaseAdapter
  (
  list
  );
 
 		
 
 		
  lv
  .
  setAdapter
  (
  adapter
  );
 
 	
  }
 
 
  /**
 
 
   * 資料初始化
 
 
   * */
 
 	
  private 
  void 
  initView
  () 
  {
 
 		
  lv 
  = 
  (
  ListView
  ) 
  findViewById
  (
  R
  .
  id
  .
  lv_demo
  );
 
 		
  tv_demo 
  = 
  (
  TextView
  ) 
  findViewById
  (
  R
  .
  id
  .
  tv_listdemo
  );
 
 		
 
 	
  }
 
 	
  class 
  MyBaseAdapter 
  extends 
  BaseAdapter
  {
 
 
  

 
 		
  private 
  List
  <
  String
  > 
  list
  ;
 
 
  

 
 		
  public 
  MyBaseAdapter
  (
  List
  <
  String
  > 
  list
  ) 
  {
 
 			
  this
  .
  list 
  = 
  list
  ;
 
 		
  }
 
 
  

 
 		
  @Override
 
 		
  public 
  int 
  getCount
  () 
  {
 
 			
 
 			
  return 
  list
  .
  size
  ();
 
 		
  }
 
 
  

 
 		
  @Override
 
 		
  public 
  Object 
  getItem
  (
  int 
  position
  ) 
  {
 
 			
  // TODO Auto-generated method stub
 
 			
  return 
  null
  ;
 
 		
  }
 
 
  

 
 		
  @Override
 
 		
  public 
  long 
  getItemId
  (
  int 
  position
  ) 
  {
 
 			
  // TODO Auto-generated method stub
 
 			
  return 
  0
  ;
 
 		
  }
 
 
  

 
 		
  @Override
 
 		
  public 
  View 
  getView
  (
  int 
  position
  , 
  View 
  convertView
  , 
  ViewGroup 
  parent
  ) 
  {
 
 			
  if
  (
  convertView
  ==
  null
  ){
 
 				
  convertView 
  = 
  View
  .
  inflate
  (
  ListViewDemo
  .
  this
  , 
  R
  .
  layout
  .
  item_lv_main
  , 
  null
  );
 
 			
  }
 
 			
  TextView 
  view 
  = 
  (
  TextView
  ) 
  convertView
  .
  findViewById
  (
  R
  .
  id
  .
  tv_item
  );
 
 			
  view
  .
  setText
  (
  list
  .
  get
  (
  position
  ));
 
 			
 
 			
  return 
  convertView
  ;
 
 		
  }
 
 		
 
 	
  }
 
 
  }
       

繼續閱讀