2017-06-11 11 views
7

Có nhiều ví dụ về cách đẩy danh sách mới vào bộ điều hợp trên thay đổi LiveData.Cập nhật RecyclerView với Android LiveData

Tôi đang cố cập nhật một hàng (ví dụ: số nhận xét cho bài đăng) trong danh sách lớn. Nó sẽ là ngu ngốc để thiết lập lại toàn bộ danh sách để thay đổi chỉ có một lĩnh vực.

tôi có thể thêm quan sát viên onBindViewHolder, nhưng tôi không thể hiểu được khi nào tôi nên loại bỏ quan sát

@Override 
public void onBindViewHolder(ViewHolder vh, int position) { 
    Post post = getPost(position); 
    vh.itemView.setTag(post); 
    post.getLiveName().observeForever(vh.nameObserver); 
    ... 
} 

Trả lời

4

Sử dụng DiffUtil có thể giúp đỡ với việc cập nhật một hàng trong một danh sách khổng lồ. Sau đó, bạn có thể có LiveData bọc danh sách các nhận xét thay vì một nhận xét hoặc thuộc tính của nhận xét.

Dưới đây là ví dụ về cách sử dụng DiffUtil trong một số RecyclerView adapterlist LiveData observation code in the fragment.

+1

Hi Lyla, liên kết của bạn vào "danh sách mã LiveData Observaion trong đoạn" không hoạt động. Thiếu "/ ui /" trong URL. URL chính xác là [ProductListFragment.java # L75] (https://github.com/googlesamples/android-architecture-components/blob/master/BasicSample/app/src/main/java/com/example/android/persistence/ ui/ProductListFragment.java # L75) - Luke – lukegjpotter

+0

Sửa lỗi liên kết! Cảm ơn! – Lyla

6

Giống như @Lyla đã nói, bạn nên quan sát toàn bộ danh sách dưới dạng LiveData trong Phân đoạn hoặc Hoạt động, khi nhận được thay đổi, bạn nên đặt toàn bộ danh sách thành bộ điều hợp theo DiffUtil.

đang Fake:

PostViewModel { 
    LiveData<List<Post>> posts; // posts comes from DAO or Webservice 
} 

MyFragment extends LifecycleFragment { 
    PostAdapter postAdapter; 

    ... 

    void onActivityCreated() { 
     ... 
     postViewModel.posts.observer(this, (postList) -> { 
      postAdapter.setPosts(postList); 
     } 
    }  
} 

PostAdapter { 
    void setPosts(List<Post> postList) { 
     DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffUtil.Callback() {...} 
     ... 
    } 
} 
0

Sử dụng Transformations.switchMap() để trao đổi các tiềm ẩn Post đối tượng. Sau đó, không cần phải loại bỏ và thêm lại các nhà quan sát khi ô được tái chế.

@Override 
public void onBindViewHolder(PostViewHolder vh, int position) { 
    Post post = getPost(position); 
    vh.bind(post); 
} 

Sau đó, trong lớp ViewHolder bạn

public class PostViewHolder extends RecyclerView.ViewHolder { 
    private final MutableLiveData<Post> post = new MutableLiveData<>(); 

    public PostViewHolder(View itemView) { 
     super(itemView); 

     LiveData<String> name = Transformations.switchMap(post, new Function<Post, LiveData<String>>() { 
      @Override 
      public LiveData<String> apply(Post input) { 
       return input.getLiveName(); 
      } 
     }); 

     name.observeForever(new Observer<String>() { 
      @Override 
      public void onChanged(@Nullable String name) { 
       // use name 
      } 
     }); 
    } 

    public void bind(Post post) { 
     post.setValue(post); 
    } 
} 
Các vấn đề liên quan