【问题标题】:RecyclerView.Adapter does not reach onCreateViewHolder when using ViewModelProviders?使用 ViewModelProviders 时 RecyclerView.Adapter 未达到 onCreateViewHolder?
【发布时间】:2020-11-09 07:31:29
【问题描述】:

我的 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;
    }

【问题讨论】:

    标签: android android-studio android-recyclerview linearlayoutmanager viewmodelproviders


    【解决方案1】:

    试试这个

    mViewModel.getJournals().observe(getViewLifecycleOwner(), journalList -> {
            Log.d(TAG, String.valueOf(journalList));
            if(hournalAdapter==null){
            journalAdapter = new JournalAdapter(getContext(), diaryListMaps);
    
            LinearLayoutManager layoutManager = new 
            LinearLayoutManager(getContext(),RecyclerView.VERTICAL,false);
            journalRecycler.setLayoutManager(layoutManager);
            journalRecycler.setAdapter(journalAdapter);
            } else {
            diaryListMaps.clear();
            diaryListMaps.addAll(journalList);
            journalAdapter.notifyDataSetChanged();
            }});
    

    也改变

    @Override
    public int getItemCount() {
          return diaryListMaps.size();
        }
        
    

    您的代码的问题是,只要数据发生变化,适配器就会一次又一次地启动,这不是处理它的正确方法。 您可以在观察方法上检查适配器是否为空,如果不为空,则只需更新列表并调用notifyDataSetChanged

    【讨论】:

    • 显然,适配器是 null 并且它给出了 NullPointerException。我应该共享堆栈跟踪吗?
    • @MoodBoard 请再次尝试我的代码,我已经对其进行了更改
    • @MoodBoard 请给对你有帮助的答案投上一票,也请批准完美的答案
    【解决方案2】:

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

     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);
    

    【讨论】:

    • 在 onBindViewHolder 方法中产生 IndexOutOfBoundsException
    • 它不起作用。我也在其他地方使用getJournals(),它在那里工作得很好。所以很可能,观察者没有工作,因此片段正在传递一个空列表。你有解决方案吗?
    • 你能用getJournals()的代码编辑问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2019-09-29
    相关资源
    最近更新 更多