首页 > 解决方案 > 使用 ViewModelProviders 时 RecyclerView.Adapter 未达到 onCreateViewHolder?

问题描述

我的 recyclerview 没有达到 onCreateViewHolder 或 getItemCount。我已经检查并确定我的项目计数不为 0,我在适配器中添加了断点,但除了构造函数之外没有调用其他方法。

我看过的问题:

RecyclerView.Adapter:

// I have added only the required methods.
public class JournalAdapter extends RecyclerView.Adapter<JournalAdapter.ViewHolder> {
   public JournalAdapter(Context context, List<Map<String, Object>> diaryListMaps) {
        this.mInflater = LayoutInflater.from(context);
        this.diaryListMaps = diaryListMaps;
        Log.d(TAG, "Adapter Size: " + diaryListMaps.size());
        Log.d(TAG, String.valueOf(diaryListMaps));
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.jourrnal_card, parent, false);
        JournalAdapter.ViewHolder viewHolder = new JournalAdapter.ViewHolder(view);
        Log.d(TAG, "onCreateViewHolder");
        return viewHolder;
    }
    @Override
    public int getItemCount() {
        if (diaryListMaps.size() == 0) {
            Log.d(TAG, "getItem: " + 1);
            return 1;
        }
        else {
            Log.d(TAG, "getItem: " + 10);
            return diaryListMaps.size();
        }
    }
}

分段:

        mViewModel = ViewModelProviders.of(this).get(DiaryDashboardViewModel.class);

        mViewModel.getJournals().observe(getViewLifecycleOwner(), journalList -> {
            Log.d(TAG, String.valueOf(journalList));
            diaryListMaps.addAll(journalList);
            journalAdapter = new JournalAdapter(getContext(), diaryListMaps);
        });

        LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
        layoutManager.setOrientation(RecyclerView.VERTICAL);

        journalRecycler.setHasFixedSize(true);
        journalRecycler.setLayoutManager(layoutManager);
        journalRecycler.setAdapter(journalAdapter);

获取期刊

public MutableLiveData<List<Map<String, Object>>> getJournals() {
        Log.d(TAG, "getJournal");
        dailyWeekColRef
                .get()
                .addOnCompleteListener(task -> {
                    if (task.isSuccessful()) {
                        List<Map<String, Object>> dummyList = new ArrayList<>();
                        for (QueryDocumentSnapshot documentSnapshot: Objects.requireNonNull(task.getResult())) {
                            Map<String, Object> dummyMap = documentSnapshot.getData();
                            Log.d(TAG, "Retrived data " + dummyMap);
                            dummyList.add(dummyMap);
                        }
                        journal.postValue(dummyList);
                    }
                    else {
                        Log.d(TAG, "task unsuccessful " + task);
                    }
                });
        return journal;
    }

标签: androidandroid-studioandroid-recyclerviewlinearlayoutmanagerviewmodelproviders

解决方案


请在调用方法new JournalAdapter(getContext(), diaryListMaps);之前setAdapter调用,并在您的观察者获得值时通知

 mViewModel.getJournals().observe(getViewLifecycleOwner(), journalList -> {
            Log.d(TAG, String.valueOf(journalList));
            diaryListMaps.clear();
            diaryListMaps.addAll(journalList);
            journalAdapter.notifyDataSetChanged();
        });


        LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
        layoutManager.setOrientation(RecyclerView.VERTICAL);

        journalRecycler.setHasFixedSize(true);
        journalRecycler.setLayoutManager(layoutManager);
        journalAdapter = new JournalAdapter(getContext(), diaryListMaps);
        journalRecycler.setAdapter(journalAdapter);

推荐阅读