0

以下はリサイクラビューの実装です。RecyclerViewアダプタを1秒ごとにリフレッシュ

リサイクラビューがリフレッシュされていますが、ビューが遅れてスクロールするのが滑らかではありません。 データをリフレッシュしないと、recyclerViewはスムーズです。 問題はリフレッシュだけです.. !!

同じスクロール位置を維持して、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

あなたは「リサイクラビューがリフレッシュしています。だからここで何をしたいですか? – UmarZaii

+0

私はrecyclerviewスクロールを円滑にしたい。現在は1秒ごとにリフレッシュリストを表示しており、recyclerviewはかなり遅れています... !! –

答えて

1

に直接割り当てるのでこれを試してみてください。

notifyItemChanged(yourPosition); 
    notifyItemInserted(yourPosition); 
    notifyItemRemoved(yourPosition); 

をしたり、範囲内に複数の変更を取得する場合は、使用することができます: あなたはこのように軽量notifies.somethingを使用する必要があります

notifyItemRangeChanged(yourPosition);//and etc 
+0

私はリスト全体をリフレッシュしたいです。私はnotifyItemRangeChanged(0、list.size());を使用しました。これはrecyclerviewをより遅くします –

+0

@RiteshKarmare notifyItemRangeChanged(0、list.size()); notifyDataSetChangedと同じですが、私はあなたのprogramListの変更を計算することをお勧めします(変更数があなたのリストのサイズよりも小さい場合)、大きなarrayListのnotifyDataSetChangeが遅いので、これらの変更を通知するだけです。 –

+0

私のrecyclerViewアイテムには4つのtextViewがあります。 2つのアイテムの場合、テキストビューの1つが変更されます。どのようにアダプタを更新すればいいですか...どのアイテムが変更されたかを追跡できますか? –

0

resetData関数内でnotifyDataSetChanged()を呼び出していることを確認してください。変更を見つけ、notifyDataSetChangedは、すべてのデータをリセットしますので、その後、ちょうどその位置を通知し、あなたのリストを更新したい場合は

また、代わりにprogramList

programList.clear(); 
programList.addAll(arrayListOfDataFromServer); 
+0

はい私は私のリセットデータ関数 –

+0

を呼び出すのですが、新しいArrayListをprogramListに割り当てる代わりに、それをクリアしてaddListを使って新しいリストの各値をprogramListに追加してください。 – Vivekanandan

+0

私も上記の解決策を試しました;しかし、ここでの問題は1秒間のリフレッシュのために遅いスクロールであるようです。 –

0

をあなたのラインthis.programDetailsList = programsList;を削除し、以下を追加します。これはシンプルなハックです。非同期コールバックを理解できる方法です。

/* 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); 
+0

notifyDataSetChanged()は既存のコードで動作しています....問題はrecyclerViewの遅いスクロールです –

+0

@ RiteshKarmare、notifyDataSetChanged()は、バックエンドでAsyncTaskによって制御されるコールバックです。 notifyDataSetChanged(index)は、特定のインデックスのデータセットの変更のみを追跡するので、より効率的です。私がprogramList.size()-1をインデックスとして配置した背景にあるロジックは、==>リサイクラビューlistitemsの更新を保持し、最後の更新されたアイテムはprogramList.size()-1です。 programList.size()が大きすぎる場合、画面には5個の項目しか保持できず、次にNotifyDataSetChanged(0)を実行すると、新しいListItemが作成され、recyclerviewに新しい項目が保持されます。 –

+0

あなたはリストアイテムをリサイクルしていないので、あなたは作っています。代わりにprogramsList.size() - 1をインデックスとして使用する必要があります。 –

0

DiffUtilを使用する。 notifyDataSetChangedは使用しないでください。

このhttps://developer.android.com/reference/android/support/v7/util/DiffUtil.htmlによれば、

はDiffUtilは 二つのリストと出力二番目に 最初のリストに変換する更新操作のリストとの間の差を計算することができるユーティリティクラスです。

RecyclerViewアダプタの更新を計算するために使用できます。

notifyDataSetChangedメソッドとは異なり、リスト全体がリロードされないため、パフォーマンスが向上します。

notifyDataメソッドのように、新しいリストと古いリストの違いを手動で見つける必要はありません。

+0

あなたは 'DiffUtil'が何であるかを説明する必要があります。さもなければ、この回答は低品質であるとスクラブされる可能性があります –

+0

大丈夫..アドバイスありがとう... –

関連する問題