ListView局部刷新的问题
2016-06-03 16:23
671 查看
有时候,我们需要更改ListView中某一个Item样式,假如这个时候使用notifydatasetChanged去刷新整个界面是没有必要的,今天我们看看如何只刷新指定条目的Item.
总结一下ListView局部刷新如何实现:
1.获取到当前可见的第一个条目和最后一个条目的位置
2.判断我们要更新的条目的位置是不是在这个范围内,这么做是为了防止ListView的复用问题
3.通过getChildAt方法获取ListView指定位置的条目View对象
4.通过这个view对象的getTag方法获取ViewHolder对象
5.更新数据
public class ListAdapter extends BaseAdapter { private List<Model> datas; private Context context; private UpdateCallback updateCallback; public UpdateCallback getUpdateCallback() { return updateCallback; } public void setUpdateCallback(UpdateCallback updateCallback) { this.updateCallback = updateCallback; } public ListAdapter(Context context) { datas = new ArrayList<Model>(); this.context = context; } public void addData(Model model) { datas.add(model); notifyDataSetChanged(); } @Override public int getCount() { // TODO Auto-generated method stub return datas.size(); } @Override public Object getItem(int pos) { // TODO Auto-generated method stub return datas.get(pos); } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(final int pos, View convertView, ViewGroup viewGroup) { final Model model = datas.get(pos); ViewHolder viewHolder = null; if (null == convertView) { viewHolder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate( R.layout.list_item_layout, null); viewHolder.pb = (ProgressBar) convertView .findViewById(R.id.pb_show); viewHolder.btn = (Button) convertView.findViewById(R.id.btn); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); convertView.setTag(viewHolder); } viewHolder.btn.setText(model.getName()); viewHolder.btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(null != updateCallback){ updateCallback.startProgress(model,pos); } } }); viewHolder.pb.setProgress(0); // cache the view return convertView; } public static class ViewHolder { ProgressBar pb; Button btn; } }
public class MainActivity extends Activity implements UpdateCallback{ ListView listview; private ListAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listview = (ListView) findViewById(R.id.listview); afterViews(); } void afterViews() { adapter = new ListAdapter(this); adapter.setUpdateCallback(this); listview.setAdapter(adapter); initDatas(); } private void initDatas() { for(int i = 0;i<100;i++){ Model model = new Model(i, "<Click> --> "); adapter.addData(model); } } @Override public void startProgress(final Model model,final int position) { /** start the Thread to update the Progress*/ new Thread(new Runnable() { @Override public void run() { for(int i = 0;i<=100;i++){ updateProgressInUiThread(model, i,position); try { Thread.sleep(50); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); } void updateProgressInUiThread(Model model,int progress,int position){ updateProgressPartly(progress,position); } private void updateProgressPartly(int progress,int position){ int firstVisiblePosition = listview.getFirstVisiblePosition(); int lastVisiblePosition = listview.getLastVisiblePosition(); //在看见范围内才更新进度条 if(position>=firstVisiblePosition && position<=lastVisiblePosition){ //获取指定位置view对象 View view = listview.getChildAt(position - firstVisiblePosition); if(view.getTag() instanceof ListAdapter.ViewHolder){ //获取指定view对应的ViewHolder ListAdapter.ViewHolder vh = (ListAdapter.ViewHolder)view.getTag(); vh.pb.setProgress(progress); } } } }
总结一下ListView局部刷新如何实现:
1.获取到当前可见的第一个条目和最后一个条目的位置
2.判断我们要更新的条目的位置是不是在这个范围内,这么做是为了防止ListView的复用问题
3.通过getChildAt方法获取ListView指定位置的条目View对象
4.通过这个view对象的getTag方法获取ViewHolder对象
5.更新数据
相关文章推荐
- JavaScript jQuery 入门回顾
- Unity3d之shaderLab内置变量
- This action could not be completed ,Try again. 提交新版本的时候出这个幺蛾子。
- .NET Core RC2/RTM 明确了时间表
- Android实现图片滚动控件,含页签功能,让你的应用像淘宝一样炫起来
- 培训讲解——Android studio模拟器创建
- SIFT特征(五)
- C Tricks(十二)—— 获取字符数组的末尾元素
- 5 款 Photoshop的替代品,可以在Linux上运行
- 异常总结 (经典)
- .NET(Core)应用程序模型及未来
- Highcharts 中文API 中文手册
- char **str和char str[8][512]做函数参数的区别
- Linux下导入SQL文件
- GREENPLUM简介
- IOS9之后强制横屏方法
- 软件工程课程建议
- 关闭所有mysql连接脚本
- bsurfaces插件二
- 14.2.4 InnoDB Undo Logs