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;
@Override
protected 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);
}
@Override
public 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 {
@Override
public int getCount() {
return data.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public 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.youkuaiyun.com/wu_shu_jun/article/details/7794576