Android Studio中绑定Firebase数据的ListView顶部搜索栏不生效问题
问题描述
开发了一款使用ListView的应用,数据从Firebase获取,但是顶部搜索栏功能无法正常运行,相关代码如下:
MainActivity 代码
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> { private static final int LIST_APP_LOADER = 0; ArrayList<Informatin> listItem; ListView listView; listAdapter adapter; DatabaseReference reference; ArrayList<Informatin> mInformation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listItem = new ArrayList<>(); listView = findViewById(R.id.list); LoaderManager.getInstance(this).initLoader(LIST_APP_LOADER, null, this); mInformation = new ArrayList<>(); adapter = new listAdapter(this, mInformation); listView.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.menu_main_screen, menu); MenuItem searchItem = menu.findItem(R.id.search_item); SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { listView.getFilter().filter(newText); return true; } }); return true; } }
listAdapter 代码
public class listAdapter extends ArrayAdapter<Informatin> implements Filterable { List<Informatin> arrayList; Context context; public listAdapter(Context context, ArrayList<Informatin> informatins) { super(context, 0, informatins); this.context=context; arrayList = informatins; } @Override public View getView(int position, View convertView, ViewGroup parent) { View listItemView = convertView; if (listItemView == null) { listItemView = LayoutInflater.from(getContext()).inflate( R.layout.list_item, parent, false); } Informatin currentList = getItem(position); TextView nameTextView = listItemView.findViewById(R.id.name); TextView descriptionTextView = listItemView.findViewById(R.id.description); TextView ageTextView = listItemView.findViewById(R.id.age); ImageView imageView = listItemView.findViewById(R.id.image); String firstName = currentList.getFirstName(); String lastName = currentList.getLastName(); String name = firstName + " " + lastName; nameTextView.setText(name); descriptionTextView.setText(currentList.getDescription()); ageTextView.setText(currentList.getAge()); return listItemView; } List<Informatin> informatins; public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { final FilterResults oReturn = new FilterResults(); final ArrayList<Informatin> results = new ArrayList<>(); if (informatins == null) informatins = arrayList; if (constraint != null) { if (informatins != null && informatins.size() > 0) { for (final Informatin g : informatins) { if (g.getFirstName().toLowerCase() .contains(constraint.toString())) results.add(g); } } oReturn.values = results; } return oReturn; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { arrayList = (ArrayList<Informatin>) results.values; notifyDataSetChanged(); } }; } }
修复方案
- 补全MainActivity中
LoaderCallbacks接口的三个实现方法,从Firebase加载完数据后,将数据添加到mInformation集合,调用adapter.notifyDataSetChanged()刷新列表,同时更新Adapter中保存的原始数据集副本。 - 修改Adapter的构造逻辑,初始化时直接保存原始数据的完整副本,避免过滤时原始数据被篡改。
- 调整过滤逻辑:补充搜索词为空时返回全量数据的处理,统一将搜索词和匹配字段转小写,解决大小写不匹配无法搜索的问题;过滤完成后直接修改传入Adapter的原始集合内容,保证父类
getItem()方法可以拿到正确的过滤后数据。 - 将搜索触发逻辑改为直接调用
adapter.getFilter().filter(newText),调用路径更稳定。
内容的提问来源于stack exchange,提问作者user17093321
相关产品推荐
相关产品推荐

