Как использовать livingata и viewmodel с видоискателем в качестве владельца жизненного цикла? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть обзор реселлера (verticalRV), который прокручивается вертикально.Каждый элемент в этом обзоре переработчика (HorizontalRV) является горизонтальным представлением переработчика.

Внутри verticalRV itemViewHodler я пытаюсь извлечь данные из модели представления и наблюдать за любыми изменениями и соответствующим образом обновить горизонтальный адаптер RV.

Но наблюдатели onChanged метод не вызывают.

Я реализовал интерфейс LifecycleOwner для управления жизненным циклом держателя просмотра с помощью liveata и установки соответствующего состояния из адаптера verticalRV

public class VeritcalRVHolderItem implements LifecycleOwner {
    private static final String TAG = LDFeedListAdapterHolder.class.getSimpleName();
    private final FragmentActivity activity;
    private final RvHorizontalListAdapter adapter;
    private RecyclerView rvHorizontalList;


    public VeritcalRVHolderItem(Context context, View itemView, FragmentActivity activity) {
        super(context, itemView);
        this.activity = activity;
        rvHorizontalList = itemView.findViewById(R.id.rvHorizontalList);
        LinearLayoutManager layout = new LinearLayoutManager(getContext(), LinearLayout.HORIZONTAL, false);
        rvHorizontalList.setLayoutManager(layout);
        adapter = new RvHorizontalListAdapter(this.activity);
        rvHorizontalList.setAdapter(adapter);
        LDViewModel LDViewModel = ViewModelProviders.of(activity).get(LDViewModel.class);
        LDViewModel.getTopicsForFeed().observe(this, new Observer<List<Topic>>() {
            @Override
            public void onChanged(List<Topic> topics) {
                //adding live discussion model at first position
                adapter.updateLiveList(topics);
                adapter.notifyItemChanged(0);
                Log.d(TAG, "discussion model calls");
            }
        });
    }

    private LifecycleRegistry lifecycleRegistry;

    public void onAppear() {
        lifecycleRegistry.markState(Lifecycle.State.CREATED);
    }

    public void onDisappear() {
        lifecycleRegistry.markState(Lifecycle.State.DESTROYED);
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return lifecycleRegistry;
    }

}

Пожалуйста, дайте мне знать, что мне не хватаетВот .

1 Ответ

0 голосов
/ 23 февраля 2019

С моей точки зрения, лучше наблюдать данные в вашем fragment или activity и передавать данные в recyclerview, в Recyclerview переопределить метод getItemViewType, из getItemViewType вы можете обрабатыватьvertical item и horizontal item.

Пример: -

public class ViewModel extends AndroidViewModel {
   private MutableLiveData<Model> modelMutableLiveData;
   public ViewModel(@NonNull Application application) {
      super(application);
      modelMutableLiveData = new MutableLiveData<>();
   }

   public MutableLiveData<Model> getModelMutableLiveData() {
      return modelMutableLiveData;
   }

   public final void yourMethod(Model model) {
      // Do something
   }
}

Класс фрагмента

public class Fragment extend BaseFragment {
    private void initViewModelData() {
       viewModel.getModelMutableLiveData().observe(this, new Observer<Model>() {
        @Override
        public void onChanged(@Nullable Model model) {
            if (model != null) {
                modelList.add(model);
                adapter.notifyItemInserted(modelList.size()- 1);
           }
        }
      });
    }
}

RecyclerViewAdapter

  class RecyclerViewAdater extend Adapter<ViewHolder>{
     @Override
     public int getItemViewType(int position) {
        return mDataList.get(position).getContainerType();
     }
  }

На основепо этому вы можете написать свой recyclerView код

...