【发布时间】: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