以下是我对Recycler视图的实现。
回收者视图令人耳目一新但视图却很落后,因此滚动不顺畅。 如果我不刷新数据,recyclelerView是平滑的。 问题是只刷新.. !!
我需要在RecyclerView中每1秒完全刷新数据,保持相同的滚动位置。
XML
<android.support.v7.widget.RecyclerView
android:id="@+id/recyView_disp_pgms"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null" />
活动:
RecyclerView recyView_disp_pgms = (RecyclerView) findViewById(R.id.recyView_disp_pgms);
DisplayProgramsAdapterRecycler pgmAdapter = new DisplayProgramsAdapterRecycler(programsList);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyView_disp_pgms.setLayoutManager(layoutManager);
recyView_disp_pgms.setAdapter(pgmAdapter);
handler = new Handler();
runnable = new Runnable() {
@Override
public void run() {
System.out.println("AllPgm Runflag : " + runflag);
programList = // Get List from database
if (programsList != null && programsList.size() > 0) {
if (pgmAdapter != null && pgmAdapter.getItemCount() > 0) {
pgmAdapter.resetData(programsList);
}
}
handler.postDelayed(this, 1000);
}
};
handler.post(runnable);
适配器:
public void resetData(ArrayList<ProgramDetails_Table> programsList) {
this.programDetailsList = programsList;
this.notifyDataSetChanged();
}
问题 - 仅在每1秒刷新一次数据时滞后回收器的滚动
尝试关注其他帖子;但仍然没有运气。 请帮忙.. !!
答案 0 :(得分:1)
如果您想刷新列表找到您的更改,然后只是通知该位置,因为notifyDataSetChanged会重置您的所有数据。 你应该使用轻量级的通知。这样的东西:
notifyItemChanged(yourPosition);
notifyItemInserted(yourPosition);
notifyItemRemoved(yourPosition);
或者如果您可以使用范围内的多个更改:
notifyItemRangeChanged(yourPosition);//and etc
答案 1 :(得分:0)
确保在resetData函数中调用notifyDataSetChanged()。
此外,请尝试此操作,而不是直接分配给programList
programList.clear();
programList.addAll(arrayListOfDataFromServer);
答案 2 :(得分:0)
删除您的专线this.programDetailsList = programsList;
并添加以下内容。这是一个简单的hack,一种让你理解异步回调的方法。
/* I have done adding one element and then deleting the same element as the last element of programsList */
/* adding and deleting triggers notifyDataChange() callback */
//add an element in index 0 as the last element into the programList
programsList.add(programsList.size() - 1, programsList.get(0));
//remove the same last element from ProgramList
programsList.add(programsList.size() - 1);
//now it works
this.notifyDataSetChanged(programsList.size() - 1);
答案 3 :(得分:0)
使用DiffUtil
。请勿使用notifyDataSetChanged
。
根据此https://developer.android.com/reference/android/support/v7/util/DiffUtil.html,
DiffUtil是一个可以计算它们之间差异的实用程序类 两个列表并输出一个转换更新操作的列表 第一个列入第二个。
它可用于计算RecyclerView适配器的更新。
与notifyDataSetChanged
方法不同,它不会重新加载整个列表,因此它具有更好的性能。
您无需手动查找新列表与旧列表之间的差异,就像notifyData
中的其他RecyclerView.Adapter
方法一样。