ListView Item 选择问题解决之道

来源:互联网 发布:c 数组删除指定元素 编辑:程序博客网 时间:2024/04/30 23:17

 在Android应用开发中,很多时候都会遇到这样的需求,一个listView,含有N项,当点击某项时,该项展开,显示该项中隐藏的某些控件,再点击,该项收回,重新隐藏部分控件,当一项打开状态,点击另一项,另一项展开,该项关闭。(说的有点绕,看下图) 

        在去年的时候,自己的一篇文章http://blog.csdn.net/aomandeshangxiao/article/details/6643831),里面有Item的选择问题,用的方法比较笨,要遍历一遍,把所有的item全部都设置一下,应该是很浪费资源的。还有一个问题就是,当listview的item多于一个屏幕的时候,会出现重复选择问题,就是当你选中一项滑动的时候,可能会发现滑动后出现的某项也是在选中状态,这个问题令人十分抓狂。见网上有个方法是:在adapter的getView里面不使用convertview。每一个view都是重新创建一个。能够解决问题,但是还是有点浪费资源。

        

        先看下效果图:第二项被选中


第四项被选中:



        这个方法也是在他人的帮助下,努力得来,分享一下!

[java] view plaincopyprint?
  1. public class ListViewTestActivity extends Activity implements OnItemClickListener{  
  2.     private ListView mListView;  
  3.     private ListAdapter mAdapter;  
  4.     @Override  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main);  
  8.           
  9.         mListView = (ListView)findViewById(R.id.list);  
  10.         mAdapter = new  ListAdapter(this);  
  11.         mListView.setAdapter(mAdapter);  
  12.         mListView.setOnItemClickListener(this);  
  13.     }  
  14.       
  15.     @Override  
  16.     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  17.         mAdapter.changeImageVisable(view, position);  
  18.     }  
  19. }  

        这里应该注意到与平常的不同,onItemClick方法里面调用了自定义ListAdapter里面的自定义changeImageViewVisable方法。

看ListAdapter:

[html] view plaincopyprint?
  1. public class ListAdapter extends BaseAdapter {  
  2.     private Context mContext;  
  3.     private View mLastView;  
  4.     private int mLastPosition;  
  5.       
  6.     public ListAdapter(Context context) {  
  7.         this.mContext = context;  
  8.     }  
  9.   
  10.     @Override  
  11.     public int getCount() {  
  12.         return 8;  
  13.     }  
  14.   
  15.     @Override  
  16.     public Object getItem(int position) {  
  17.         return null;  
  18.     }  
  19.   
  20.     @Override  
  21.     public long getItemId(int position) {  
  22.         return 0;  
  23.     }  
  24.   
  25.     @Override  
  26.     public View getView(int position, View convertView, ViewGroup parent) {  
  27.         Holder holder;  
  28.         if(convertView == null ) {  
  29.             LayoutInflater inflater = LayoutInflater.from(mContext);  
  30.             convertView = inflater.inflate(R.layout.list_item, null);  
  31.             holder =new Holder();  
  32.             holder.textView = (TextView)convertView.findViewById(R.id.textView);  
  33.             holder.UEFAView = (ImageView)convertView.findViewById(R.id.image_uefa);  
  34.             holder.mascotView = (ImageView)convertView.findViewById(R.id.image_mascot);  
  35.             holder.hint = convertView.findViewById(R.id.hint_image);  
  36.             convertView.setTag(holder);  
  37.         } else {  
  38.             holder = (Holder) convertView.getTag();  
  39.         }  
  40.         holder.textView.setText("Hello,It is " + position);  
  41.         return convertView;  
  42.     }  
  43.       
  44.     class Holder {  
  45.         TextView textView;  
  46.         ImageView UEFAView;  
  47.         ImageView mascotView;  
  48.         View hint;  
  49.     }  
  50.       
  51.     public void changeImageVisable(View view,int position) {  
  52.         if(mLastView != null && mLastPosition != position ) {  
  53.             Holder holder = (Holder) mLastView.getTag();  
  54.             switch(holder.hint.getVisibility()) {  
  55.             case View.VISIBLE:  
  56.                 holder.hint.setVisibility(View.GONE);  
  57.                 break;  
  58.             default :  
  59.                 break;  
  60.             }  
  61.         }  
  62.         mLastPosition = position;  
  63.         mLastView = view;  
  64.         Holder holder = (Holder) view.getTag();  
  65.         switch(holder.hint.getVisibility()) {  
  66.         case View.GONE:  
  67.             holder.hint.setVisibility(View.VISIBLE);  
  68.             break;  
  69.         case View.VISIBLE:  
  70.             holder.hint.setVisibility(View.GONE);  
  71.             break;  
  72.         }  
  73.     }  
  74.   
  75. }  

       代码的最下端是changeImageVisable方法。(注意:在这个方法中,博客代码版本和提供下载代码版本中有细微差异,博客代码较下载代码性能更优,这也体现了Holder类的优越性,一定要好好用好Holder,应好好思考下,为什么这样写性能就更好些呢?欢迎留言讨论)。

        布局文件:

main.xml:

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <TextView  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="ListView Test" />  
  11.     <ListView   
  12.         android:id="@+id/list"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="fill_parent"  
  15.         ></ListView>  
  16.   
  17. </LinearLayout>  

list_item.xml:

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="wrap_content"  
  6.     android:orientation="vertical"  
  7.     >  
  8.     <TextView   
  9.         android:id="@+id/textView"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="Test"  
  13.         android:textSize="20sp"  
  14.         />  
  15.     <LinearLayout  
  16.         android:id="@+id/hint_image"  
  17.         android:layout_width="match_parent"  
  18.         android:layout_height="wrap_content"  
  19.         android:orientation="horizontal"  
  20.         android:visibility="gone">  
  21.         <ImageView   
  22.             android:id="@+id/image_uefa"  
  23.             android:layout_width="0dp"  
  24.             android:layout_height="60dp"  
  25.             android:layout_weight="1"  
  26.             android:src="@drawable/uefa"  
  27.             />  
  28.         <ImageView   
  29.             android:id="@+id/image_mascot"  
  30.             android:layout_width="0dp"  
  31.             android:layout_height="60dp"  
  32.             android:layout_weight="1"  
  33.             android:src="@drawable/mascot"  
  34.             />  
  35.           
  36.     </LinearLayout>  
  37.       
  38. </LinearLayout>  

         布局只是简单的写了下,弄了两张欧洲杯的图。

      最后代码下载地址:http://download.csdn.net/detail/aomandeshangxiao/4384922

        如果是有所帮助,在下面微微顶一个吧。

原创粉丝点击