19

Ben RecyclerView Adaptör

RecyclerView.Adapter<RecyclerView.ViewHolder> 

genişletilmiş çalışmıyor notifyDataSetChanged Ve aradığında:

mRecyclerView.getAdapter().notifyDataSetChanged(); 

Hiçbir şey olmadı. Ben ekranda bir yanıp sönme görebilirsiniz

  1. :

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

    Bu çözüm ile iki sorunlar var:

    görünümü yenilemek için tek yol yeniden adaptörü (see this answer) ayarlamaktır yeniden ayarlandığında adaptör

  2. Liste görünümü birinci konuma geri döner.

Herhangi bir fikir?

+0

Eğer MyAdapter içinde notifyDataSetChanged yöntemi kapsülleyen denediniz: – bajicdusko

+0

@helionprime Yardımcı olmadı :( – David

+0

tamam, benim kötü güncellenmiş veriyi "onBindViewHolder" yöntemiyle almayı/kullanmayı unuttum. göz kırpma efekti, ondan nasıl kurtulabilirim? – David

cevap

17

getItemCount(), 0 değerini döndürürse, notifyDataSetChanged() hiçbir şey yapmayacaktır. Bağdaştırıcınızı başlattığınızda, geçerli bir veri kümesi geçirdiğinizden emin olun.

4

javadocs'a göre: Eğer bir adaptör yazıyorsanız, daha spesifik değişiklik olaylarını kullanmak için her zaman daha verimli olacaktır. Son çare olarak notifyDataSetChanged()'a güvenin. I() kullanın RETROFIT en onResponse üzerinde, listesi getirilemedi Sonradan montaj kullanıyorum

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

, üzerinde SetLayoutManager() aramaya unutmuş bir şans var daha görünüm güncellemelerini tetiklemez

adapter.swap(feedList); 
+0

"javadocs'a göre: Eğer bir adaptör yazıyorsanız, javadocs'ta bu bilgiyi nereden buldunuz? Eğer daha spesifik değişiklik olaylarını kullanmak her zaman daha verimli olacaktır. –

+0

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

13

notifyDataSetChanged() ise Senin RecyclerView (ben yaptım gibi). Sadece bunu unutmayın:

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

Eğer SetAdapter() aramadan önce;

C# kodu için üzgünüm, Xamarin kullanıyorum.

0

Bir şeyleri paylaşmak isterdim, aynı sorunla karşı karşıya kalıyordum. Ama yanlış yaptığım şeydi. Her defasında yeni bir Bağdaştırıcı örneği oluşturuyordum ve bu yeni örneğe daha önce değil de notifysetDatachange() yöntemini kullanıyorum.

Lütfen, lütfen NotifysetDatachange() yönteminin kime ait olduğunu doğrulayın. Örneğin aşağıda Umut() ana iş parçacığı çağrılabilir sholud ..

 MyAdapter mAdapter = new MyAdapter(...) 

    mRecyclerView.setAdapter(mAdapter); 

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


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

    } 

    } 
-4

notifyDataSetChanged yardımcı olur.

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

Bu sorun gibi görünmüyor – Gabriel

0

biz aşağıdakileri yapabilirsiniz recyclerview güncellemek için? Örnek: "myNdaifyDataSetChanged" öğesini MyAdapter içinde oluşturun ve bu yöntemden this.notifyDataSetChanged() öğesini çağırın. MyAdapter referansını kaydedin ve myRecyiclerView.getAdapter() yerine myAdapterRef.myNotifyDataSetChanged() öğesini çağırın. NotifyDataSetChanged().Bu yüzden benim için neden çalıştığını bilmiyorum (ListView ile bu sorunu yaşadım)