You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:39:02