每1秒刷新一次RecyclerView适配器

时间:2017-07-18 05:32:52

标签: android performance android-recyclerview recycler-adapter

以下是我对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秒刷新一次数据时滞后回收器的滚动

尝试关注其他帖子;但仍然没有运气。 请帮忙.. !!

4 个答案:

答案 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方法一样。