首页 > 学院 > 开发设计 > 正文

ListView 局部刷新

2019-11-09 14:57:50
字体:
来源:转载
供稿:网友

转载请注明出处:http://blog.csdn.net/darling_R/article/details/54946362 本文出自:哎呀小嘿的博客

在软件里面,list列表几乎是必不可少的,但是有时候需要刷新列表,而notifyDataSetChanged()又是刷新全部数据,性能就会相对下降,为了解决定向刷新某一条数据,特意写了瓷片文章,希望能对一些需要的人有帮助,废话不多说,直接上代码。

这里是MainActivity:

public class MainActivity extends AppCompatActivity { 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()); adapter.setListView(lv); 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.updateItemData(item); } }); } /** * 初始化数据 */ private void intitData() { list = new ArrayList<>(); for (int i = 0; i < 20; i++) { MyListItem item = new MyListItem(); item.setData("item " + i); item.setPosition(i); list.add(item); } }}

关键代码还是 adapter里面的:

public class MyListAdapter extends BaseAdapter { /** * listview中的数据集 */ private ArrayList<MyListItem> mDataList; private Context mContext; private ListView mListView; public MyListAdapter(ArrayList<MyListItem> list, Context cont) { this.mDataList = list; this.mContext = cont; } /** * 设置listview对象 * * @param lisv */ public void setListView(ListView lisv) { this.mListView = lisv; } /** * update listview 单条数据 * * @param item 新数据对象 */ public void updateItemData(MyListItem item) { Message msg = Message.obtain(); int ids = -1; // 进行数据对比获取对应数据在list中的位置 for (int i = 0; i < mDataList.size(); i++) { if (mDataList.get(i).getPosition() == item.getPosition()) { ids = i; } } msg.arg1 = ids; // 更新mDataList对应位置的数据 mDataList.set(ids, item); // handle刷新界面 han.sendMessage(msg); } @SuppressLint("HandlerLeak") private Handler han = new Handler() { public void handleMessage(android.os.Message msg) { updateItem(msg.arg1); } }; /** * 刷新指定item * * @param index item在listview中的位置 */ private void updateItem(int index) { if (mListView == null) { return; } // 获取当前可以看到的item位置 int visiblePosition = mListView.getFirstVisiblePosition(); // 如添加headerview后 firstview就是hearderview // 所有索引+1 取第一个view // View view = listview.getChildAt(index - visiblePosition + 1); // 获取点击的view View view = mListView.getChildAt(index - visiblePosition); TextView txt = (TextView) view.findViewById(R.id.textView1); // 获取mDataList.set(ids, item);更新的数据 MyListItem data = (MyListItem) getItem(index); // 重新设置界面显示数据 txt.setText(data.getData()); } @Override public int getCount() { return mDataList.size(); } @Override public Object getItem(int position) { return mDataList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, null); } TextView txt = (TextView) convertView.findViewById(R.id.textView1); txt.setText(mDataList.get(position).getData()); return convertView; }

代码里面注释写的都很清楚了,这里就不在赘述了。 数据类:

public 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; } }
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表