ListView局部更新
来源:互联网 发布:淘宝商城女童装 编辑:程序博客网 时间:2024/05/01 01:50
notifyDataSetChanged()方法调用更新的是可见区域的所有子view。
那可以尝试只更新某个position的子view
核心方法,在自定义adapter加一个方法:
public void upatePosition(int position) {// 只更新listview某一项int visitFirstPositon = mListView.getFirstVisiblePosition();int visitLastPositon = mListView.getLastVisiblePosition();if (position >= visitFirstPositon && position <= visitLastPositon) {// 要更新的item已经显示在界面上getView(position,mListView.getChildAt(position - visitFirstPositon),mListView);}}
对比测试:
1.调用notifyDataSetChanged方法打印的getView的log:
2.新写的局部刷新
可见,传统的notifyDataSetChanged是更新了可视区域所有子view,而局部刷新只更新了某个位置。
测试代码很简单,布局就一个listview和两个按钮
主要的测试activity:
package com.example.listview111;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.LayoutInflater;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener {private ListView mListView;private MyAdapter mAdaAdapter;private Button mBu1, mBu2;private String[] data;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();}private void initData() {mBu1.setOnClickListener(this);mBu2.setOnClickListener(this);data = new String[20];for (int i = 0; i < data.length; i++) {data[i] = "item" + i;}mAdaAdapter = new MyAdapter();mListView.setAdapter(mAdaAdapter);}private void changed1() {//传统方式data[0] = data[0] + "-change1";data[data.length - 1] = data[data.length - 1] + "-change1";Log.d("chaged1() ", "传统使用notifyDataSetChanged()");mAdaAdapter.notifyDataSetChanged();}private void changed2() {//局部刷新data[0] = data[0] + "-change2";data[data.length - 1] = data[data.length - 1] + "-change2";Log.d("chaged2() ", "新写的局部更新");mAdaAdapter.upatePosition(0);mAdaAdapter.upatePosition(data.length - 1);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.main_bu1:changed1();break;case R.id.main_bu2:changed2();break;}}private void initView() {mListView = (ListView) findViewById(R.id.main_lsitview);mBu1 = (Button) findViewById(R.id.main_bu1);mBu2 = (Button) findViewById(R.id.main_bu2);}class MyAdapter extends BaseAdapter {@Overridepublic int getCount() {return data.length;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;Log.d("adapter", "getView() " + position + " convertView==null?"+ (convertView == null));if (convertView == null) {convertView = LayoutInflater.from(MainActivity.this).inflate(android.R.layout.simple_list_item_1, null);holder = new ViewHolder();holder.textView = (TextView) convertView.findViewById(android.R.id.text1);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.textView.setText(data[position]);return convertView;}public void upatePosition(int position) {// 只更新listview某一项int visitFirstPositon = mListView.getFirstVisiblePosition();int visitLastPositon = mListView.getLastVisiblePosition();if (position >= visitFirstPositon && position <= visitLastPositon) {// 要更新的item已经显示在界面上getView(position,mListView.getChildAt(position - visitFirstPositon),mListView);}}class ViewHolder {TextView textView;}}}
参考:http://blog.csdn.net/wu_shu_jun/article/details/7794576
0 0
- ListView局部更新
- ListView局部更新
- ListView实现局部更新
- ListView局部更新(非notifyDataSetChanged)
- ListView实现局部更新的方法
- react native 实现ListView的局部更新
- ListView中 局部刷新Item 实现下载进度条局部更新
- 关于更新局部listview中数据的问题
- RecyclerView超简单demo(局部更新取代ListView)
- ListView局部更新Item,不调用notifyDataSetChanged()方法
- Android性能优化——局部更新ListView item
- ListView的局部更新,不调用notify方法
- ListView的局部更新,不调用notify方法
- 局部更新
- (listview局部更新)在activity中获取listview的item子项view
- 关于局部更新listview的问题(只更新某个item)
- 关于局部更新listview的问题(只更新某个item)
- 关于局部更新listview的问题(只更新某个item)
- SVM系列
- 003.main 主函数文件
- Matplotlib以小时为单位统计文件数据
- 怎样编写概要设计
- Mybatis批量插入、更新
- ListView局部更新
- 编写测量矩阵代码需要用到的几个常见函数
- 堆排序(C#)
- 基因检测-基因系统聚类
- 002.FKPerson 类的实现文件
- 遇到 scp报错:not a regular file 解决 so easy!!!
- 001.FKPerson 类的接口文件
- 数据库知识点笔记
- 牛逼的ios在github上的库