android中有关ListView的一些问题

本文探讨了Android中ListView的使用,包括setOnItemSelectedListener和setOnItemClickListener的区别,以及在数据改变时如何更新列表。还提到了CheckBox状态混乱的解决办法,建议使用convertView/ViewHolder缓存技术来提高ListView性能,并解释了其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

ListView setOnItemSelectedListener setOnItemClickListener 区别

OnItemSelectedListener.setOnItemSelectedListener()

指的是鼠标获得一个条目的焦点,字面上理解是选择一个条目

OnItemClickListener.setOnItemClickListener()

指的是你单击一个条目。

如果你从鼠标滚动(或者说选择一个条目)过渡到单击一个条目,都会在调用OnItemClickListener.setOnItemClickListener()之前调用一次OnItemSelectedListener.onNothingSelected()。貌似是因为你单击了一个条目之前就默认你没有选择任何条目,所以会触发一个OnItemSelectedListener.onNothingSelected()

 

 

 

 

有关ListView中数据改变时,怎么办。

在你改变数据的后面加上一句adapter.notifyDataSetChanged(),adapter是Adapter的实例化对象,android自带的可以,你自己写的Adapter也可以

 

 

 

有关网上的 ListView中用到CheckBox,CheckBox的状态混乱的问题。

· 我敢说你们一定是用了convertView/ViewHolder 这种缓存技术。如果你不用这种技术,就没有CheckBox状态混乱的情况出现;但是取而代之的是你CheckBox的状态没有被保存,因为BaseAdapter中的getView()方法只会绘出ListView的每一行,他没有义务为你保存CheckBox的状态。需要你自己去在getView中做一些工作。

· 无论你采不采用convertView/ViewHolder 这种缓存技术,你可以通过这种方法解决CheckBox的状态保存与一致的问题。

就是设置一个Map<Integer, Boolean>  checkState=new HashMap<Integer, Boolean>();保存你当前选择的状态。然后在BaseAdapter的getView()方法中通过CheckBox checkBox=(CheckBox)convertView.findViewById(R.id.check)中获取到CheckBox,然后再checkBox.setChecked()就可以啦。很简单把?

· 其实还是用convertView/ViewHolder 这种缓存技术比较好,这样子你浏览ListView的时候速度很快。而不采用convertView/ViewHolder 这种缓存技术的时候,你会明显感觉ListView很卡

· convertView/ViewHolder 缓存技术的实质,其实就是convertView的复用,因为我在查看convertView是否为null的时候,只有7次它输出null,其余都是convertView不为null。也就是说convertView这个对象引用只有7个(每个手机不同,就是一个屏幕最多容纳的条目数)。convertView/ViewHolder 其实是在复用每一个条目的View。只让这7个引用对应7个View的实例,而不是我们每次都给一个引用建立一个新的View实例。这样子,在ListView绘制调用getView的时候,我们只建立了7个View实例,只是每次把View中的内容改变了一下,比如TextView.setText(str)。这样子程序就很快

075      public class MyAdapter extends BaseAdapter{
076  
077          private LayoutInflater mInflater;
078           
079           
080          public MyAdapter(Context context){
081              this .mInflater = LayoutInflater.from(context);
082          }
083          @Override
084          public int getCount() {
085              // TODO Auto-generated method stub
086              return mData.size();
087          }
088  
089          @Override
090          public Object getItem( int arg0) {
091              // TODO Auto-generated method stub
092              return null ;
093          }
094  
095          @Override
096          public long getItemId( int arg0) {
097              // TODO Auto-generated method stub
098              return 0 ;
099          }
100  
101          @Override
102          public View getView( int position, View convertView, ViewGroup parent) {
103               
104              ViewHolder holder = null ;
105              if (convertView == null ) {
106                   
107                  holder= new ViewHolder(); 
108                   
109                  convertView = mInflater.inflate(R.layout.vlist2, null );
110                  holder.img = (ImageView)convertView.findViewById(R.id.img);
111                  holder.title = (TextView)convertView.findViewById(R.id.title);
112                  holder.info = (TextView)convertView.findViewById(R.id.info);
113                  holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
114                  convertView.setTag(holder);
115                   
116              } else {
117                   
118                  holder = (ViewHolder)convertView.getTag();
119              }
120               
121               
122              holder.img.setBackgroundResource((Integer)mData.get(position).get( "img" ));
123              holder.title.setText((String)mData.get(position).get( "title" ));
124              holder.info.setText((String)mData.get(position).get( "info" ));
125               
126              holder.viewBtn.setOnClickListener( new View.OnClickListener() {
127                   
128                  @Override
129                  public void onClick(View v) {
130                      showInfo();                
131                  }
132              });
133               
134               
135              return convertView;
136          }
137           
138      }

 

· 有关 convertView/ViewHolder 缓存技术参见网址的最后一种方法    http://www.cnblogs.com/allin/archive/2010/05/11/1732200.htm

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值