回收者视图未使用领域数据更新数据

时间:2020-10-05 18:22:32

标签: android android-recyclerview realm

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

这是我的课程:

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

}

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

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

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

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

建议-我们应该保留适配器变量的私有性,并仅使用函数更新这些变量。另外,还应在适配器或其功能内调用notifyDataSetChanged()。

答案 1 :(得分:0)

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

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