使用SwipeRefresh刷新,notifyItemRangeChanged并没有局部刷新

从数据库中拿出的数据,在每次刷新的时候都会再全部加载一次,刷新一次就多出一次重复数据:

SwipeRefresh的OnRefresh方法如下:

@Override

public void onRefresh() {

new AsyncTask<Void, Void, List<User>>() {

@Override

protected List<User> doInBackground(Void... params) {

List<User> list = new ArrayList<User>();

dbRead = db.getReadableDatabase();

//这里不设置任何条件,输出全部,如果要进行条件查询,则像"name=?"这样写,把具体条件写在

// 后面一个参数中,这是为了防止SQL注入攻击

Cursor c = dbRead.query("user", null, null, null, null, null, null);

while (c.moveToNext()) {

int id = c.getInt(c.getColumnIndex("_id"));

String name = c.getString(c.getColumnIndex("name"));

String sex = c.getString(c.getColumnIndex("sex"));

user = new User(name, sex);

System.out.println(name + ":-----------:" + id);

list.add(user);

}

dbRead.close();

return list;

}

@Override

protected void onPostExecute(List<User> users) {

super.onPostExecute(users);

myAdapter.addItems(users);

//停止刷新

swipeRefreshLayout.setRefreshing(false);

//滑动到第一项

recyclerView.scrollToPosition(0);

}

}.execute();

}

MyAdapter继承自Recyclerview.Adapter,其中添加数据的代码如下:

 public void addItems(List<User> items) {

if (items == null)

return;

this.datas.addAll(0, items);

this.notifyItemRangeChanged(0, items.size());

}

效果如下:
图片描述

回答:

notifyItemRangeChanged 是告知列表项的改动,而你这里的操作是列表项的插入,应该使用 notifyItemRangeInserted

回答:

addItem方法中应该先调用list.clear()方法。。

以上是 使用SwipeRefresh刷新,notifyItemRangeChanged并没有局部刷新 的全部内容, 来源链接: utcz.com/p/168338.html

回到顶部