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

Android多语言ListView搜索栏开发求助:实现列表数据过滤功能

实现ListView多语言搜索过滤的解决方案

核心思路

利用ArrayAdapter的Filter机制实现列表过滤,同时解决过滤后列表位置与原数组不匹配的问题,并且支持大小写不敏感搜索提升体验。由于你的数据从strings.xml获取,会自动适配当前语言环境,用户输入对应语言词汇即可匹配。


步骤1:定义全局变量

将Adapter和原始数据数组设为Activity全局变量,方便后续访问:

private ArrayAdapter<String> adapter;
private String[] originalStoryNames; // 保存原始多语言数据,用于获取正确索引

步骤2:自定义大小写不敏感Adapter

默认ArrayAdapter的过滤是大小写敏感的,自定义Adapter优化体验:

public class CaseInsensitiveArrayAdapter extends ArrayAdapter<String> {
    private String[] originalData;

    public CaseInsensitiveArrayAdapter(Context context, int resource, int textViewResourceId, String[] objects) {
        super(context, resource, textViewResourceId, objects);
        originalData = objects.clone();
    }

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();
                List<String> filteredList = new ArrayList<>();

                if (constraint == null || constraint.length() == 0) {
                    // 无过滤条件时返回全部数据
                    filteredList.addAll(Arrays.asList(originalData));
                } else {
                    String filterPattern = constraint.toString().toLowerCase().trim();
                    // 遍历原始数据,匹配包含过滤文本的项(大小写不敏感)
                    for (String item : originalData) {
                        if (item.toLowerCase().contains(filterPattern)) {
                            filteredList.add(item);
                        }
                    }
                }

                results.values = filteredList;
                results.count = filteredList.size();
                return results;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                clear();
                addAll((List<String>) results.values);
                notifyDataSetChanged();
            }
        };
    }
}

步骤3:初始化数据与Adapter

替换原有Adapter初始化代码,使用自定义Adapter:

listView = findViewById(R.id.Lv);
listView.setSelected(true);
share = findViewById(R.id.share);
timkiembar = findViewById(R.id.timkiembar);

// 初始化原始多语言数据
originalStoryNames = getResources().getStringArray(R.array.stories_names);
// 使用自定义Adapter
adapter = new CaseInsensitiveArrayAdapter(this, R.layout.row, R.id.row_txt, originalStoryNames);
listView.setAdapter(adapter);

步骤4:实现搜索栏过滤逻辑

在TextWatcher中触发Adapter的过滤方法:

timkiembar.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) {
        // 触发过滤,s为用户输入的文本
        adapter.getFilter().filter(s);
    }

    @Override
    public void afterTextChanged(Editable s) {}
});

步骤5:修复点击事件的索引问题

过滤后列表位置与原数组索引不匹配,需找到点击项的原始索引:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String selectedItem = adapter.getItem(position);
        int originalPosition = -1;
        // 遍历原始数组找到对应索引
        for (int i = 0; i < originalStoryNames.length; i++) {
            if (originalStoryNames[i].equals(selectedItem)) {
                originalPosition = i;
                break;
            }
        }
        if (originalPosition != -1) {
            Intent intent = new Intent(Reading.this, web.class);
            intent.putExtra("story_key", originalPosition);
            startActivity(intent);
        }
    }
});

多语言适配说明

通过getResources().getStringArray()获取的数据会自动匹配当前系统语言,因此用户输入对应语言的词汇时,过滤逻辑会直接匹配当前语言的内容,无需额外处理多语言适配。

内容的提问来源于stack exchange,提问作者Chonha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:36:20