我有一个回收站视图,其中列出了一组名称。在“回收者”视图上方,我有一个搜索字段,用户应可以在其中搜索特定名称,并且在键入他们以仅显示相关结果时,“回收者”视图应进行更新。
这是我的课程:
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
实际上并不会更新回收者视图,因此最终没有任何改变。
我在做什么错了?
答案 0 :(得分:1)
您需要在适配器类中创建一个方法来更新适配器。如下所示-
public void updateData(RealmResults<Person> personList) {
this.persons = personList;
notifyDataSetChanged();
}
建议-我们应该保留适配器变量的私有性,并仅使用函数更新这些变量。另外,还应在适配器或其功能内调用notifyDataSetChanged()。
答案 1 :(得分:0)
我认为您需要在适配器中设置数据。
adapter.persons.clear();
adapter.addAll(persons);
adapter.notifyDataSetChanged();