3

저는 Architecture Components를 실험하고 있으며 RecyclerView의 각 항목에 대한 ViewModel을 작성하려고합니다. 공식적으로 맞는지 확실하지 않거나 "오래된 방법"을 고수해야합니다. 잘 작동하지만 아주 기본입니다Android Architecture 구성 요소 : RecyclerView 항목에 ViewModel 사용

public class PostAdapter extends RecyclerView.Adapter<PostAdapter.PostViewHolder> { 

    private List<Post> list; 
    public static class PostViewHolder extends RecyclerView.ViewHolder{ 
     final ItemPostBinding binding; 

     public PostViewHolder(ItemPostBinding binding){ 
      super(binding.getRoot()); 
      this.binding = binding; 
     } 
    } 

    @Override 
    public PostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     ItemPostBinding binding = DataBindingUtil 
       .inflate(LayoutInflater.from(parent.getContext()), R.layout.item_post, 
         parent, false); 


     return new PostViewHolder(binding, parent.getContext()); 
    } 

    @Override 
    public void onBindViewHolder(PostViewHolder holder, int position) { 
     holder.binding.setPost(list.get(position)); 
     holder.binding.executePendingBindings(); 
    } 

    @Override 
    public int getItemCount() { 
     return list == null ? 0 : list.size(); 
    } 

    public void setList(List<Post> list){ 
     this.list = list; 
     notifyDataSetChanged(); 
    } 
} 

:

나는이 어댑터가 있습니다. 각 항목이 자신의 ViewModel과 연결되도록 업데이트하려면 어떻게해야합니까? 그게 가능한가?

편집 : 그것은 작동하지만 올바른 방법은 그것을 할 것입니다

public class PostAdapter extends RecyclerView.Adapter<PostAdapter.PostViewHolder> { 

    private List<Post> list; 
    public static class PostViewHolder extends RecyclerView.ViewHolder{ 
     final ItemPostBinding binding; 
     private final Context context; 
     private GalleryItemViewModel viewModel; 

     public PostViewHolder(ItemPostBinding binding, Context context){ 
      super(binding.getRoot()); 
      this.binding = binding; 
      this.context = context; 
     } 

     public Context getContext(){ 
      return context; 
     } 

     public void setViewModel(GalleryItemViewModel viewModel){ 
      this.viewModel = viewModel; 
      binding.setViewModel(viewModel); 
     } 
    } 

    @Override 
    public PostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     ItemPostBinding binding = DataBindingUtil 
       .inflate(LayoutInflater.from(parent.getContext()), R.layout.item_post, 
         parent, false); 


     return new PostViewHolder(binding, parent.getContext()); 
    } 

    @Override 
    public void onBindViewHolder(PostViewHolder holder, int position) { 
     GalleryItemViewModel vm = ViewModelProviders.of((FragmentActivity) holder.getContext()).get(GalleryItemViewModel.class); 
     vm.setPost(list.get(position)); 
     holder.setViewModel(vm); 
    } 

    @Override 
    public int getItemCount() { 
     return list == null ? 0 : list.size(); 
    } 

    public void setList(List<Post> list){ 
     this.list = list; 
     notifyDataSetChanged(); 
    } 
} 

: 그것으로 재생, 나는 ViewModels에 다음과 같은 방법을 넣어 시도했습니다?

+0

안녕 Jacopo, 당신은 다른 방법으로 어댑터를 사용할 수 있습니다 .. –

+0

나에게 예제 또는 링크를 따라 줄 수 있습니까? –

+0

문제가 발생할 때까지 느낀다면 https://stackoverflow.com/questions/47432835/displaying-data-in-a-recyclerview/47433409#47433409 –

답변

2

재미,하지만 대답은 - 이것은 올바른 방법입니다, 받아 들여야 : 당신은 몇 가지 코드 정리를하고 열심히 참조를 만들고 그것을 사용하지 않기 때문에, PostViewHolder에서 GalleryItemViewModel을 제거 할 수 있습니다. 그런 다음 dirrectly onBindViewHolder()이 당신을 도울 수 MVVM 코드 예제와 link입니다 holder.binding.setViewModel(vm);

처럼 사용합니다.

관련 문제