【问题标题】:Recycler view not updating data with Realm data回收站视图不使用领域数据更新数据
【发布时间】:2020-10-05 18:22:32
【问题描述】:

我有一个回收站视图,其中列出了一组名称。在回收站视图上方,我有一个搜索字段,用户应该能够在其中搜索特定名称,并且回收站视图应该在他们键入时更新以仅显示相关结果。

这是我的课:

public class MyFragment extends Fragment {

    private EditText searchField;

    private RecyclerView recyclerView;

    private MyAdapter adapter;

    private Realm realm;

    private RealmResults<Person> persons;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
        realm = Realm.getDefaultInstance();

        return inflater.inflate(R.layout.fragment_persons, parent, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        searchField = view.findViewById(R.id.search_field);
        recyclerView = view.findViewById(R.id.recycler_view);

        searchField.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                String query = searchField.getText().toString();
                fetchPersons(query);
                adapter.notifyDataSetChanged();
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext());

        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        fetchPersons("");

        adapter = new MyAdapter(getContext(), persons);
        recyclerView.setAdapter(adapter);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();

        if (realm != null) {
            realm.close();
            realm = null;
        }
    }

    private void fetchPersons(String query) {
        persons = realm.where(Person.class)
                .contains("name", query)
                .findAll();
    }

}

但是,在 onTextChanged 中调用 adapter.notifyDataSetChanged(); 实际上并不会更新回收站视图,因此最终不会发生任何变化。

我做错了什么?

【问题讨论】:

  • 您是否在适配器中的 person 变量每次更改时更新它?不确定你的适配器是什么样子的,但似乎你只在它初始化时传递它的人并且你从不更新它
  • 不确定你的意思。我在片段内部更改persons,然后调用适配器进行更新。
  • 是的,您更新了片段中的人员,但您确定适配器persons 与片段persons 相同吗?您如何在适配器中获取persons
  • new MyAdapter(getContext(), persons),MyAdapter 类中的构造函数,其中设置了this.persons = persons
  • 对,所以适配器没有与片段相同的人员,它有自己的人员变量,您需要在更改 fragment.persons 之后执行adapter.persons = fragment.persons 之类的操作,然后再调用通知数据集已更改

标签: android android-recyclerview realm


【解决方案1】:

您需要在适配器类中创建一个方法来更新适配器。如下 -

   public void updateData(RealmResults<Person> personList) {
    this.persons = personList;
    notifyDataSetChanged();
}

建议 - 我们应该保持适配器变量私有,并且只使用函数更新这些变量。 notifyDataSetChanged() 也应该在适配器或其函数中调用。

【讨论】:

    【解决方案2】:

    我认为您需要在适配器中设置数据。

    adapter.persons.clear();
    adapter.addAll(persons);
    adapter.notifyDataSetChanged();
    

    【讨论】:

    • clear 和 addAll for RealmResults 已弃用,如果我使用它们会在运行时崩溃。
    • 将适配器内部的数据类型更改为 ArrayList
    • 它必须是 RealmResults 才能在这里工作
    • 那么就做adapter.persons = persons; adapter.notifyDataSetChanged();
    猜你喜欢
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多