19

मैंRecyclerView एडाप्टर काम नहीं कर रहा notifyDataSetChanged

RecyclerView.Adapter<RecyclerView.ViewHolder> 

बढ़ाया और जब मैं कहा जाता है:

mRecyclerView.getAdapter().notifyDataSetChanged(); 

कुछ भी नहीं हुआ।

  1. मैं स्क्रीन पर एक झपकी देख सकते हैं:

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

    मैं इस समाधान के साथ दो मुद्दे हैं:

    दृश्य को ताज़ा करने के लिए एक ही रास्ता फिर से अनुकूलक (see this answer) स्थापित करने के लिए है जब मैं फिर से एडाप्टर

  2. सेट करता हूं तो सूची दृश्य पहली स्थिति में वापस आ जाता है।

कोई भी विचार?

+0

आप MyAdapter में notifyDataSetChanged विधि संपुटित करने की कोशिश की? उदाहरण के लिए: MyAdapter में "myNotifyDataSetChanged" बनाएं और उस विधि से यह कॉल करें। नोटिफाइडडेटासेट चेंज() "। MyAdapter संदर्भ सहेजें और myReiciclerView.getAdapter() के बजाय myAdapterRef.myNotifyDataSetChanged() को कॉल करें। NotifyDataSetChanged()।Sont जानते हो क्यों यह मेरे लिए काम किया (मैं ListView साथ कि समस्या थी) – bajicdusko

+0

@helionprime :( – David

+0

मदद नहीं था ठीक है, मेरा बुरा। मैं के बारे में प्राप्त करने के लिए/'onBindViewHolder' विधि के भीतर ही अपडेट डाटा का उपयोग करें। लेकिन क्या भूल गया पलक प्रभाव, मैं इसे कैसे से छुटकारा पाने के कर सकते हैं? – David

उत्तर

17

यदि आपका getItemCount() 0 देता है, तो notifyDataSetChanged() कुछ भी नहीं करेगा। सुनिश्चित करें कि जब आप अपना एडाप्टर प्रारंभ करते हैं, तो आप एक वैध डेटासेट पास कर रहे हैं।

4

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(); 
} 

मैं रेट्रोफिट उपयोग कर रहा हूँ सूची प्राप्त करने में, रेट्रोफिट के onResponse पर() का उपयोग,

adapter.swap(feedList); 
+0

"javadocs के अनुसार: आप एक एडाप्टर यह हमेशा अधिक से अधिक विशिष्ट परिवर्तन की घटनाओं का उपयोग करने के कर सकते हैं, तो कुशल हो जाएगा लिख ​​रहे हैं, तो" जहां javadocs में आप इस जानकारी पता चला? –

+0

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyDataSetChanged() –

13

तो notifyDataSetChanged() दृश्य अपडेट ट्रिगर नहीं करता से इस बात की संभावना है कि आप पर SetLayoutManager() कॉल करने के लिए भूल गए हैं है आपका रीसाइक्लर व्यू (जैसा मैंने किया था!)। बस यह करने के लिए मत भूलना:

var manager = new LinearLayoutManager(Context, LinearLayoutManager.Vertical, false); 
_list.SetLayoutManager(manager); 

इससे पहले कि आप SetAdapter() कहते हैं;

सी # कोड के लिए खेद है, मैं Xamarin का उपयोग कर रहा हूँ।

0

कुछ साझा करना चाहते हैं, मुझे एक ही समस्या का सामना करना पड़ रहा था। लेकिन मैं क्या गलत कर रहा था। मैं हर बार नया एडाप्टर का उदाहरण बना रहा था और उस नए उदाहरण के लिए notifysetDatachange() करने से पुराना नहीं था।

तो यकीन है कि एडाप्टर जिसे तुम notifysetDatachange() पुराने एक होना चाहिए कि सुनिश्चित करें। आशा उदाहरण नीचे में मदद करता है ..

 MyAdapter mAdapter = new MyAdapter(...) 

    mRecyclerView.setAdapter(mAdapter); 

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


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

    } 

    } 
-4

notifyDataSetChanged() मुख्य थ्रेड में कहा जा sholud।

+0

यह समस्या होने के लिए प्रतीत नहीं होता – Gabriel

0

recyclerview अद्यतन करने के लिए हम निम्न कर सकते हैं:

1. Create and set adapter again: 

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

2. Clear model list data and then notify: 

    ArrayList<YourModel> tempModel=new ArrayList<>(modelList); 
    modelList.clear(); 
    modelList.addAll(tempModel); 
    adapter.notifyDataSetChanged(); 
संबंधित मुद्दे