ListView的数据更新
ListView可以通过notifyDataSetChanged()来更新页面上的数据。
但是有的时候当这个ListView中所有的Item只有一个需要改变数据,则不适合适用notifyDataSetChanged()来更新页面.因为该方法会把所有的Item重新加载一遍。
一ListView的局部刷新要点:
1.找到页面上要刷新的Item,确定位置。
2.根据位置改变Adapter的数据源。
3.主动更新页面上的Item显示。
代码如下:
package com.jlu.zhangfy.listviewrefresh;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends Activity
{
private ArrayList<MyListItem> list = null;
private ListView lv;
private MyListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intitData();
lv = (ListView) findViewById(R.id.listView1);
adapter = new MyListAdapter(list,getApplicationContext());
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
// 获取listview中点击item的数据
MyListItem item = (MyListItem) parent.getItemAtPosition(position);
Log.i("eee", item.getData() + " == " + item.getPosition());
// 更新数据
item.setData("update item " + position);
// 更新界面
adapter.update(item.getPosition(),lv);
}
});
}
/**
* 初始化数据
*/
private void intitData()
{
list = new ArrayList<MyListItem>();
for (int i = 0; i < 20; i++)
{
MyListItem item = new MyListItem();
item.setData("item " + i);
item.setPosition(i);
list.add(item);
}
}
/**
* 自定义item数据类型
*/
class MyListItem
{
/**
* 数据id
*/
private int dataId;
/**
* 数据
*/
private String data;
public int getPosition()
{
return dataId;
}
public void setPosition(int position)
{
this.dataId = position;
}
public String getData()
{
return data;
}
public void setData(String data)
{
this.data = data;
}
}
}
Adapter中的代码:
package com.jlu.zhangfy.listviewrefresh;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
/**
* Created by Administrator on 2016/7/15.
*/
public class MyListAdapter extends BaseAdapter{
private ArrayList mList;
private Context mContext;
private LayoutInflater mLaouInflater;
public MyListAdapter(ArrayList<MainActivity.MyListItem> list, Context context){
mList = list;
mContext = context;
mLaouInflater = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
this.notifyDataSetChanged();
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if(convertView == null){
convertView = mLaouInflater.inflate(R.layout.listitem,parent,false);
viewHolder = new ViewHolder();
viewHolder.mTextView = (TextView) convertView.findViewById(R.id.tv);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.mTextView.setText(((MainActivity.MyListItem) mList.get(position)).getData());
return convertView;
}
class ViewHolder{
private TextView mTextView;
}
public void update(int position, ListView mListView){
((MainActivity.MyListItem) mList.get(position)).setData("update date");
int visiblePosition = mListView.getFirstVisiblePosition();
View view = mListView.getChildAt(position - visiblePosition);
TextView txt = (TextView) view.findViewById(R.id.tv);
txt.setText("update date");
}
}
对于局部刷新的重要意义会根据需求有所改变,但要点不变。
二利用框架的notifyDataSetChanged()也可以实现局部刷新(补充)
默认情况下:在只改变数据源某项的情况下notifyDataSetChanged()也只会更新页面中的一项。