ListView利用Handler只更新一条数据

因为项目中有用到Listview,,而项目需求中是如果点击item中的查看更多按钮,就显示当前item的完整数据。最开始是用ArrayList集合将多余的数据,存储到集合中,点击查看更多按钮,则将集合中的数据,遍历添加到布局中显示。虽然基本接近了想要的效果,但是后来考虑到如果数据量太大的话,实际上用集合存储是非常有挑战的事情。所以就考虑到了用Handler机制来刷新数据。

Handler的用法相信大家都十分熟悉了,无非是调用sendMessage(message)发送一条消息给轮询器,然后轮询器再接收到数据之后,进行判断,更新ui。代码如下:

发送消息:

<span style="font-size:14px;color:#663333;">tv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Message message=new Message();message.what=1;handler.sendMessage(message);//发送消息给轮询器}});</span> 接收消息:<span style="font-size:14px;color:#663333;"> private Handler handler=new Handler(){public void handleMessage(android.os.Message msg) {switch (msg.what) {case 1:adapter.notifyDataSetChanged();//这里执行更新ui的操作break;}};};</span> 但是在更新ui的操作中,我们调用的是adapter.notifyDataSetChanged(),而这个方法会重新调用Adapter里面所有的方法,进行ui的更新,在数据量大的情况下,是很消耗内存的,这显然不是我们想要得到的效果。后来查了很多资料,发现可以在Adapter中添加一个updateview方法,就可以达到我们想要的效果。代码如下:

class MyAdapter extends BaseAdapter{int selectIndex;Handler handler=new Handler(){public void handleMessage(Message msg) {if(msg.what==1){updataView(selectIndex);}};};@Overridepublic int getCount() {return strs.size();}@Overridepublic Object getItem(int position) {return strs.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ViewHolder viewholder = null;if(convertView==null){viewholder=new ViewHolder();convertView=getLayoutInflater().inflate(R.layout.item, null);viewholder.textview=(TextView) convertView.findViewById(R.id.textview);viewholder.imageview=(ImageView) convertView.findViewById(R.id.imageview);convertView.setTag(viewholder);}else{viewholder=(ViewHolder) convertView.getTag();}viewholder.textview.setText(strs.get(position));viewholder.imageview.setImageResource(R.drawable.ic_launcher);viewholder.imageview.setVisibility(View.VISIBLE);viewholder.textview.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {selectIndex=position;Message message=new Message();message.what=1;handler.sendMessage(message);}});return convertView;}//需要更新的itemprivate void updataView(int num) {int FirstViewIndex=lv.getFirstVisiblePosition();//获取第一个可见item的索引View view=lv.getChildAt(num-FirstViewIndex);//获取想要更新的item对象TextView tv=(TextView) view.findViewById(R.id.textview);ImageView iv=(ImageView) view.findViewById(R.id.imageview);if(num<2){tv.setText(strs.get(num+2));<span style="white-space:pre">}else{tv.setText(strs.get(num-2));}iv.setVisibility(View.GONE);}class ViewHolder {TextView textview;ImageView imageview;}}

事实上我们看到,这里还是利用了handler的消息处理机制。在接收消息的时候,调用updateview这个方法,并传入想要更新的item索引,然后拿到view对象,填充数据。看吧就是这么简单。

部分参考:

版权声明:本文为博主原创文章,未经博主允许不得转载。

快乐不是因为拥有的多而是计较的少

ListView利用Handler只更新一条数据

相关文章:

你感兴趣的文章:

标签云: