проблема с вложенным recyclerview и наблюдением за LiveData

#mvvm #android-recyclerview #nested #android-room #android-livedata

#mvvm #android-recyclerview #вложенный #android-комната #android-livedata

Вопрос:

У меня есть вложенный RecyclerView и два LiveData. один из них — parentList, а другой — childList Мне удалось использовать LiveData для ParentAdapter, но когда я пытаюсь использовать LiveData для ChildAdapter, в childAdapter ничего не отображается. ParentAdapter работает. Кто-нибудь может мне помочь? Спасибо?

этот метод находится в MainActivity.class

 private void sendAllDataToAdapter(){

        CashFlowViewModel viewModel = ViewModelProviders.of(this).get(CashFlowViewModel.class);
        viewModel.cashGroupByDate().observe(this, new Observer<List<CashFlow>>() {
            @Override
            public void onChanged(List<CashFlow> cashFlows) {
                adapter.submitList(cashFlows);
            }
        });

        adapter = new MainAdapter(this, this);
        recyclerView.setAdapter(adapter);
    }
 

Это ParentAdapter

 public class MainAdapter extends ListAdapter<CashFlow, MainAdapter.MainViewHolder>{
    Context context;
    List<CashFlow> cashFlowList = new ArrayList<>();
    List<CashFlow> cashFlowListChild = new ArrayList<>();
    CashflowRepository repository;
    CashFlowViewModel  viewModel;
    LifecycleOwner lifecycleOwner;

    public MainAdapter(Context context, LifecycleOwner lifecycleOwner) {
        super(diffCallback);
        this.context = context;
        this.cashFlowList = cashFlowList;
        this.cashFlowListChild = cashFlowListChild;
        this.repository = repository;
        this.lifecycleOwner = lifecycleOwner;
        viewModel = ViewModelProviders.of((MainActivity) context).get(CashFlowViewModel.class);
    }

    private static final DiffUtil.ItemCallback<CashFlow> diffCallback = new DiffUtil.ItemCallback<CashFlow>() {
        @Override
        public boolean areItemsTheSame(@NonNull CashFlow oldItem, @NonNull CashFlow newItem) {
            return oldItem.getId() == newItem.getId();
        }

        @Override
        public boolean areContentsTheSame(@NonNull CashFlow oldItem, @NonNull CashFlow newItem) {
            return oldItem.getAdded_date().equals(newItem.getAdded_date())
                    amp;amp; oldItem.getTitle().equals(newItem.getTitle())
                    amp;amp; oldItem.getBody().equals(newItem.getBody());
        }
    };


    @NonNull
    @Override
    public MainViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.main_adapter, parent, false);
        return new MainViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MainViewHolder holder, int position) {
        holder.tvDate.setText(getItem(position).getAdded_date());
        holder.tvIncome.setText(String.valueOf(getItem(position).getIncome()));
        holder.tvExpense.setText(String.valueOf(getItem(position).getExpense()));

        ChildAdapter adapter = new ChildAdapter(context);
        holder.rvChild.setAdapter(adapter);

        viewModel.cashGroupByDate().observe(lifecycleOwner, new Observer<List<CashFlow>>() {
            @Override
            public void onChanged(List<CashFlow> cashFlows) {
                adapter.submitList(cashFlows);
            }
        });

        Log.d("Child", getItem(position).getAdded_date() "");


    }




    public class MainViewHolder extends RecyclerView.ViewHolder {
        TextView tvDate, tvIncome, tvExpense;
        RecyclerView rvChild;

        public MainViewHolder(@NonNull View itemView) {
            super(itemView);
            tvDate = itemView.findViewById(R.id.main_adapter_date);
            tvIncome = itemView.findViewById(R.id.main_adapter_income);
            tvExpense = itemView.findViewById(R.id.main_adapter_expense);
            rvChild = itemView.findViewById(R.id.child_recyclerview);

        }
    }
 

Это дочерний адаптер

 public class ChildAdapter extends ListAdapter<CashFlow, ChildAdapter.ChildViewHolder> {
    Context context;

    public ChildAdapter(Context context) {
        super(diffCallback);
        this.context = context;
    }

    private static final DiffUtil.ItemCallback<CashFlow> diffCallback = new DiffUtil.ItemCallback<CashFlow>() {
        @Override
        public boolean areItemsTheSame(@NonNull CashFlow oldItem, @NonNull CashFlow newItem) {
            return oldItem.getId() == newItem.getId();
        }

        @Override
        public boolean areContentsTheSame(@NonNull CashFlow oldItem, @NonNull CashFlow newItem) {
            return oldItem.getAdded_date().equals(newItem.getAdded_date())
                    amp;amp; oldItem.getBody().equals(newItem.getBody())
                    amp;amp; oldItem.getTitle().equals(newItem.getTitle())
                    amp;amp; oldItem.getExpense() == newItem.getExpense()
                    amp;amp; oldItem.getIncome() == newItem.getIncome()
                    amp;amp; oldItem.getType().equals(newItem.getType());
        }
    };


    @NonNull
    @Override
    public ChildViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.child_adapter, parent, false);
        return new ChildViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ChildViewHolder holder, int position) {
        holder.imageView.setImageResource(getItem(position).getImage_id());
        holder.tvTitle.setText(getItem(position).getTitle());
        if (getItem(position).getType().equals(BaseActivity.INCOME)){
            holder.tvSum.setText(String.valueOf(getItem(position).getIncome()));
        }
        else if (getItem(position).getType().equals(BaseActivity.EXPENSE)){
            holder.tvSum.setText(String.valueOf(getItem(position).getExpense()));
        }
    }


    public class ChildViewHolder extends RecyclerView.ViewHolder {

        ImageView imageView;
        TextView tvTitle, tvSum;

        public ChildViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.child_adapter_image);
            tvTitle = itemView.findViewById(R.id.child_adapter_title);
            tvSum = itemView.findViewById(R.id.child_adapter_sum);
        }
    }
}
 

Это мой ViewModel.class

 public class CashFlowViewModel extends AndroidViewModel {
    private CashflowRepository repository;

    public CashFlowViewModel(@NonNull Application application) {
        super(application);
        repository = new CashflowRepository(application);
    }

    public void insert(CashFlow cashFlow){
        repository.insert(cashFlow);
    }
    public void update(CashFlow cashFlow){
        repository.update(cashFlow);
    }
    public void delete(CashFlow cashFlow){
        repository.delete(cashFlow);
    }
    public LiveData<List<CashFlow>> cashGroupByDate(){
        return repository.getCashGroupByDate();
    }
    public LiveData<List<CashFlow>> cashByDate(String addedDate){
        return repository.getCashByDate(addedDate);
    }


    public void insertCategory(Category category){
        repository.insertCategory(category);
    }
    public void updateCategory(Category category){
        repository.updateCategory(category);
    }
    public void deleteCategory(Category category){
        repository.deleteCategory(category);
    }
    public List<Category> allCategories(String type){
        return repository.getAllCategories(type);
    }