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