web-dev-qa-db-ja.com

RecyclerViewアダプターnotifyDataSetChangedが機能しない

延長しました

RecyclerView.Adapter<RecyclerView.ViewHolder>

そして、私が電話したとき:

mRecyclerView.getAdapter().notifyDataSetChanged();

何も起こらなかった。

ビューを更新する唯一の方法は、アダプターを再設定することです( この回答を参照 ):

mRecyclerView.setAdapter(new MyAdapter(...));

このソリューションには2つの問題があります。

  1. アダプターを再度設定すると、画面に点滅が表示される
  2. リストビューは最初の位置に戻ります。

何か案は?

27
David

notifyDataSetChanged()がビューの更新をトリガーしない場合、RecyclerViewでSetLayoutManager()を呼び出すのを忘れている可能性があります(私がしたように!)。忘れないでください:Java code:

_LinearLayoutManager layoutManager = new LinearLayoutManager(context ,LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager)
_

C#コード、私はXamarinを使用しています。

_var layoutManager = new LinearLayoutManager(Context, LinearLayoutManager.Vertical, false);
recyclerView.SetLayoutManager(layoutManager);
_

recyclerView.SetAdapter(adapter);を呼び出す前に

28

getItemCount()が0を返す場合、notifyDataSetChanged()は何もしません。アダプタを初期化するときに、有効なデータセットを渡すようにしてください。

24
IgorGanapolsky

Javadocsによると:アダプターを作成している場合は、可能であれば、より具体的な変更イベントを使用する方が常に効率的です。最後の手段としてnotifyDataSetChanged()に依存してください。

public class NewsAdapter extends RecyclerView.Adapter<...> {    

private static List mFeedsList;
...

    public void swap(List list){
    if (mFeedsList != null) {
        mFeedsList.clear();
        mFeedsList.addAll(list);
    }
    else {
        mFeedsList = list;
    }
    notifyDataSetChanged();
}

RetrofitのonResponse()を使用して、Retrofitを使用してリストを取得しています。

adapter.swap(feedList);
4
Akshay Goyal

Recyclerviewを更新するために、次のことができます。

  1. アダプターを再度作成して設定します。

    adapter=new MyAdapter(...);
    mRecyclerView.setAdapter(adapter);
    
  2. モデルリストデータを消去してから通知します。

    List<YourModel> tempModel=new ArrayList<>(modelList); 
    modelList.clear();   
    modelList.addAll(tempModel); 
    adapter.notifyDataSetChanged();
    
2
Mayur Prasad

何かを共有したい、私は同じ問題に直面していた。しかし、私が間違っていたことは。新しいたびにアダプタのインスタンスを作成し、古いインスタンスではなく、その新しいインスタンスにnotifysetDatachange()を実行していました。

したがって、setDataChange()を通知するアダプタが古いアダプタであることを確認してください。以下の例が役立つことを願っています。

     MyAdapter mAdapter = new MyAdapter(...)

    mRecyclerView.setAdapter(mAdapter );

// TODO 
mAdapter.modifyData(....);
mAdapter.notifySetDataChange();


    MyAdapter extends baseAdapter {
     MyAdapter () {
    }
    modifyData(String[] listData) {

    }

    }
0
sharma_kunal

だから私はこのように私の問題を修正しました:orderListはrecyclerviewに渡すリストです。リスト内の位置にアイテムを追加できます。ここで、0はリスト内の0番目の位置です。次にadapter.notifyDataSetChanged()を呼び出します。魔法のように働く

1)orderList.add(0、String); 2)orderAdapter.notifyDataSetChanged();