下面是我的回收器视图实现。
回收器视图正在刷新,但视图滞后很多,滚动不平滑。如果我不刷新数据,回收器视图是平滑的。问题是只刷新…!!
我需要刷新数据完全每1秒在RecyclerView保持相同的滚动位置。
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秒刷新数据时,回收器视图的滚动滞后
尝试跟随其他帖子;但仍然没有运气。请帮助…!!
如果您想刷新列表,请找到您的更改,然后只需通知该位置,因为通知fyDataSetChanged会重置您的所有数据。你应该使用轻量级通知。类似这样的东西:
notifyItemChanged(yourPosition);
notifyItemInserted(yourPosition);
notifyItemRemoved(yourPosition);
或者,如果您在一个范围内进行了多个更改,您可以使用:
notifyItemRangeChanged(yourPosition);//and etc
使用DiffUtil
。不要使用通知fyDataSetChanged
。
根据https://developer.android.com/reference/android/support/v7/util/DiffUtil.html,
DiffUtil是一个实用程序类,它可以计算两个列表之间的差异并输出将第一个列表转换为第二个列表的更新操作列表。
它可用于计算RecyclerView适配器的更新。
不同于nodefyDataSetChanged
方法,它不会重新加载整个列表,因此它有更好的性能。
并且您不必像RecycliView. Adapter
中的其他通知数据
方法一样手动查找新列表和旧列表之间的差异。
删除您的行this.编程细节列表=编程列表;
并添加以下内容。这是一个简单的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);