【问题标题】:Why ain't my fragment cannot display data from recyclerview?为什么我的片段不能显示来自 recyclerview 的数据?
【发布时间】:2019-08-03 22:18:12
【问题描述】:

在这里发帖之前,我花了相当多的时间自己弄清楚,不过我已经删除了各种错误。我正在开发一个小笔记应用程序,一切都很好,直到我在我的应用程序中使用了包含回收器视图的片段。问题是我无法将从数据库检索到的数据传递给回收器视图适配器。

错误提示“尝试在空对象引用上调用虚拟方法 'void com.example.diary.RecyclerAdapter.setdata(java.util.List)'”

我已验证数据不为空,我很困惑为什么会出现空指针错误。

相关代码贴在下面。

fragment.java

 @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_recents, container, false);
    RecyclerAdapter adapter;
    db = NotesDatabase.createdb(getContext());

    adapter = new RecyclerAdapter(numofitems); 
     retrievetasks();
    layoutManager = new LinearLayoutManager(getActivity());
    binding = DataBindingUtil.setContentView(getActivity(), R.layout.fragment_recents);
    binding.recyclerView.setLayoutManager(layoutManager);
    binding.recyclerView.setAdapter(adapter);
    Log.d("adapeter", "has set");
    return view;
}

public void retrievetasks() {
    try {
        LiveData<List<NotesEntry>> notesEntries = db.Dao().loadalltasks();
        notesEntries.observe(this, new Observer<List<NotesEntry>>() {
            @Override
            public void onChanged(List<NotesEntry> notesEntries) {
                notes = notesEntries;
                Log.d("sizeforall", String.valueOf(notesEntries.size()));
                adapter.setdata(notesEntries); //this is where the error occures }
             });

'adapter.setdata(notesEntries); //这是发生错误的地方'

adapter.java

 public void setdata(List<NotesEntry> notesEntries) {
    try {
        notesEntryList = notesEntries;
        notifyDataSetChanged();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public List<NotesEntry> getnotesentries() {
    return notesEntryList;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    try {
        NotesEntry notesEntries = notesEntryList.get(position);
        id = notesEntries.getId();
        text = notesEntries.getText();
        // b1.setText(String.valueOf(id));
        textview1.setText(text);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Override
public int getItemCount() {
    if (!notesEntryList.isEmpty()) {
        Log.d("sizereturned", String.valueOf(notesEntryList.size()));
        return notesEntryList.size();
    } else
        Log.d("sizereturned1", String.valueOf(notesEntryList.size()));
    return 0; }

如果我不使用片段,则不会出现此问题。感谢任何帮助。

【问题讨论】:

  • 你在哪里初始化numofitems

标签: java android android-fragments android-recyclerview


【解决方案1】:

你需要在初始化适配器后调用retrievetasks()方法。这是导致问题的原因

adapter = new RecyclerAdapter(numofitems);
retrievetasks();

【讨论】:

  • 感谢您的回复。我之前和现在都试过了,结果没有改变。同样的空指针错误。 @Viswanath Kumar Sandu
  • RecyclerAdapter 适配器;将此行移到 onCreateView 方法之外
【解决方案2】:

retrieveTasks 中的adapter 与您初始化的不同。您正在初始化一个本地实例,该实例超出了 retrieveTasks 方法的范围。大概你在片段中有一个名为adapter 的属性,所以你可以删除本地实例来初始化正确的实例:

@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_recents, container, false);
    RecyclerAdapter adapter; // <- DELETE THIS
    db = NotesDatabase.createdb(getContext());
    adapter = new RecyclerAdapter(numofitems);
}

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-13
    • 2020-02-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多