2017-06-12 14 views
6

Tôi có nhiều ViewHolders hoạt động như các khung nhìn được phân tách bên trong RecyclerView dọc. Tôi đang thực hành với Chế độ xem thành phần kiến ​​trúc mới.cách sử dụng Cấu phần Kiến trúc ViewModel bên trong Bộ điều hợp RecyclerView?

bên trong ViewModel của tôi Tôi có một vài danh sách MutableLiveData mà tôi muốn quan sát. nhưng làm thế nào tôi có thể gọi

ViewModelProviders.of((AppCompatActivity)getActivity()).get(FilterViewModel.class) 

mFilterViewModel.getCountries().observe(this, new Observer<ArrayList<TagModel>>() { 
      @Override 
      public void onChanged(@Nullable ArrayList<TagModel> tagModels) { 

      } 
     }); 

mà không bị rò rỉ hoạt động hoặc lưu hoạt động bên trong bộ chuyển đổi.

ViewModel của tôi

public class FilterViewModel extends ViewModel { 

private final MutableLiveData<ArrayList<TagModel>> mCountries; 
private final MutableLiveData<ArrayList<TagModel>> mSelectedCountryProvinceList; 
private final MutableLiveData<ArrayList<TagModel>> mDistanceList; 

public FilterViewModel(){ 

    mCountries = new MutableLiveData<>(); 
    mSelectedCountryProvinceList = new MutableLiveData<>(); 
    mDistanceList = new MutableLiveData<>(); 

    TagStore.getInstance().subscribe(new StoreObserver<TagSearchList>() { 
     @Override 
     public void update(TagSearchList object) { 
      mCountries.setValue(object.getCountries()); 
     } 

     @Override 
     public void update(int id, TagSearchList object) { 
      if (id == 5){ 
       TagStore.getInstance().unSubcribe(this); 
       update(object); 
      } 
     } 

     @Override 
     public void error(String error) { 

     } 
    }).get(5,"parent"); 

    TagStore.getInstance().subscribe(new StoreObserver<TagSearchList>() { 
     @Override 
     public void update(TagSearchList object) { 
      mSelectedCountryProvinceList.setValue(object.toList()); 
     } 

     @Override 
     public void update(int id, TagSearchList object) { 
      if (id == 6){ 
       TagStore.getInstance().unSubcribe(this); 
       update(object); 
      } 
     } 

     @Override 
     public void error(String error) { 

     } 
    }).get(6,"parent"); 

    TagStore.getInstance().subscribe(new StoreObserver<TagSearchList>() { 
     @Override 
     public void update(TagSearchList object) { 
      mDistanceList.setValue(object.toList()); 
     } 

     @Override 
     public void update(int id, TagSearchList object) { 
      if (id == 51){ 
       TagStore.getInstance().unSubcribe(this); 
       update(object); 
      } 
     } 

     @Override 
     public void error(String error) { 

     } 
    }).get(51,"parent"); 

} 

public void selectCountry(final TagModel country){ 
    TagStore.getInstance().subscribe(new StoreObserver<TagSearchList>() { 
     @Override 
     public void update(TagSearchList object) { 
      mSelectedCountryProvinceList.setValue(object.toList()); 
     } 

     @Override 
     public void update(int id, TagSearchList object) { 
      if (id == country.getId()){ 
       TagStore.getInstance().unSubcribe(this); 
       update(object); 
      } 
     } 

     @Override 
     public void error(String error) { 

     } 
    }).get(country.getId(),"parent"); 
} 

public LiveData<ArrayList<TagModel>> getCountries(){ 
    return mCountries; 
} 

public LiveData<ArrayList<TagModel>> getDistances(){ 
    return mDistanceList; 
} 

public LiveData<ArrayList<TagModel>> getProvinces(){ 
    return mSelectedCountryProvinceList; 
} 

}

+0

Xin chào. Tại sao bạn không muốn sử dụng Android Data Binding để thay thế? – JuliaKo

+0

Xin chào @ JuliaKo, đó không phải là ý định của tôi để cấu trúc lại ứng dụng của tôi thành MVVM. Tại thời điểm này tôi sử dụng MVP. tôi muốn sử dụng lớp ViewModel với khung MVP để giải quyết các vấn đề về vòng đời, tải lại dữ liệu và các Observables không cần thiết. –

+0

Tôi nghĩ rằng những gì bạn cần là để thực hiện các bộ điều hợp ràng buộc, và nhóm google sẽ làm cho vòng đời liên kết dữ liệu nhận biết nhưng để điều đó xảy ra, vòng đời cần phải đạt tới 1,0 api ổn định. Bạn có thể xem xét vấn đề đã mở tại đây: https://github.com/googlesamples/android-architecture-components/issues/34 – JuliaKo

Trả lời

0

Giải pháp của tôi cho vấn đề này là;

  • tạo một biến mới (ViewModel) cho cách bố trí (đoạn hoặc hoạt động bố trí)
  • trong hoạt động hoặc mảnh của bạn được thể hiện của ViewModel của bạn với ViewModelProviders
  • giữ dữ liệu mà lấp đầy recyclerView của bạn trong MutableLiveData và quan sát nó và điền vào bộ điều hợp của recyclerView với giá trị mà bạn quan sát được

tại đây bạn nên cẩn thận không tạo ví dụ bộ điều hợp trong phương pháp quan sát. nếu bạn tạo nó trong phương pháp quan sát, nó sẽ làm cho rò rỉ

+0

Bạn có thể giải thích tại sao việc tạo bộ điều hợp trong phương pháp quan sát có gây ra rò rỉ không? –

0

Chỉ dành cho người đọc trong tương lai. Các giải pháp tôi có thể cung cấp:

  • Trong hoạt động này, tạo ViewModelProvider dụ:

    cung cấp ViewModelProvider = ViewModelProviders.of (this);

  • Tiếp theo, đi qua nó để constructor của adapter

  • Trong lớp ViewHolder của bộ chuyển đổi tạo một constructor, trong đó có một trường hợp FilterBinding và thực hiện

    super(binding.getRoot());

  • phương pháp
  • Bên onCreateViewHolder chỉ nhanh chóng ràng buộc với, ví dụ, DataBindingUtil.inflate (...) và trả về một cá thể ViewHolder, nó lấy sự ràng buộc này vì nó phụ thuộc bởi hàm tạo;

  • Chế độ xem bên trong Lớp hàn tạo phương thức lấy TagModel (hoặc chính xác bạn là gì vì y chưa thấy bộ điều hợp của bạn và không hiểu rõ những gì đang diễn ra trong logic của bạn) bindings:

    if (mBindings == null) { FilterViewModel vm = viewModelProvider.get(FilterViewModel.class); /*or instantiate? I am not sure about caching here, honestly. If you chose instantiating, then passing ViewModelProvider to the adapter is not needed*/ mBindings.setViewModel(vm); } mBindings.getViewModel(setItem(item)); mBindings.executePendingBindings();

  • Và, cho qua, chỉ thực hiện phương pháp ràng buộc của viewholder này bên onBindViewHolder (...)

Thành thật mà nói, tôi không cảm thấy cách này đẹp và đẹp, nhưng đó là tất cả những gì tôi có thể cung cấp.

Các vấn đề liên quan