19

tôi mở rộngRecyclerView Adaptor notifyDataSetChanged không làm việc

RecyclerView.Adapter<RecyclerView.ViewHolder> 

Và khi tôi gọi:

mRecyclerView.getAdapter().notifyDataSetChanged(); 

Không có gì xảy ra.

Cách duy nhất để làm mới quan điểm là để thiết lập lại adapter (see this answer):

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

Tôi có hai vấn đề với giải pháp này:

  1. tôi có thể nhìn thấy một chớp trên màn hình khi tôi đặt lại bộ đổi nguồn
  2. Chế độ xem danh sách trở về vị trí đầu tiên.

Bất kỳ ý tưởng nào?

+0

Bạn đã cố gắng để đóng gói phương pháp notifyDataSetChanged trong MyAdapter? Ví dụ: Tạo "myNotifyDataSetChanged" trong MyAdapter và từ phương thức đó gọi this.notifyDataSetChanged() ". Lưu tham chiếu MyAdapter và gọi myAdapterRef.myNotifyDataSetChanged() thay vì myRecyiclerView.getAdapter(). NotifyDataSetChanged().Không biết tại sao nó làm việc cho tôi (tôi đã có vấn đề với ListView) – bajicdusko

+0

@helionprime Đã không giúp: ( – David

+0

ok, xấu của tôi.Tôi quên để có được/sử dụng dữ liệu cập nhật trong phương pháp 'onBindViewHolder'. Nhưng những gì về hiệu ứng nhấp nháy, làm thế nào tôi có thể loại bỏ nó? – David

Trả lời

17

Nếu số getItemCount() trả về 0, sau đó notifyDataSetChanged() sẽ không làm gì cả. Đảm bảo rằng khi bạn khởi tạo bộ điều hợp, bạn đang chuyển một tập dữ liệu hợp lệ.

4

Theo javadocs: Nếu bạn đang viết một bộ điều hợp, sẽ luôn hiệu quả hơn khi sử dụng các sự kiện thay đổi cụ thể hơn nếu bạn có thể. Dựa vào notifyDataSetChanged() như một phương sách cuối cùng.

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

Tôi đang sử dụng Retrofit để lấy danh sách, trên onResponse Retrofit của() sử dụng,

adapter.swap(feedList); 
+0

"Theo javadocs: Nếu bạn đang viết một adapter thì sẽ luôn hiệu quả hơn khi sử dụng các sự kiện thay đổi cụ thể hơn nếu bạn có thể" tìm thấy thông tin này ở đâu trong javadocs? –

+0

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

13

Nếu notifyDataSetChanged() không kích hoạt xem thông tin cập nhật hơn là một cơ hội mà bạn đã quên để gọi SetLayoutManager() trên RecyclerView của bạn (như tôi đã làm!). Đừng quên làm điều này:

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

trước khi bạn gọi SetAdapter();

Xin lỗi vì mã C#, tôi đang sử dụng Xamarin.

0

Muốn chia sẻ điều gì đó, tôi đã gặp phải vấn đề tương tự. Nhưng những gì tôi đã làm sai là. Tôi đã tạo ra thể hiện của Adapter mỗi lần mới và hơn làm notifysetDatachange() cho cá thể mới đó không phải là phiên bản cũ hơn.

Vì vậy, hãy đảm bảo Bộ điều hợp mà bạn không nhận dạngDatachange() phải cũ hơn. Hy vọng ví dụ dưới đây sẽ giúp ..

 MyAdapter mAdapter = new MyAdapter(...) 

    mRecyclerView.setAdapter(mAdapter); 

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


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

    } 

    } 
-4

thông báoDataSetChanged() sholud được gọi trong chủ đề chính.

+0

Điều này dường như không phải là vấn đề – Gabriel

0

Để cập nhật recyclerview chúng ta có thể làm như sau:

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(); 
Các vấn đề liên quan