You need to enable JavaScript to run this app. Android开发:ListView搜索过滤后如何获取ArrayList的原始位置
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:ListView搜索过滤后如何获取ArrayList的原始位置

问题根因

搜索过滤后ListView展示的是筛选后的子列表,你在onItemClick中直接用回调传入的位置i做跳转判断,这个i是子列表的位置,和原始列表的索引不匹配,所以会出现跳转错误的问题。

修复步骤

  • 第一步:完善DoaSearchIndex.java,补全原始索引的存储和读取逻辑
public class DoaSearchIndex {
    private String doaSearchIndex;
    private int originalPosition;
    // 构造函数新增原始位置入参
    public DoaSearchIndex(String doaSearchIndex, int originalPosition) {
        this.doaSearchIndex = doaSearchIndex;
        this.originalPosition = originalPosition;
    }
    public String getDoaSearchIndex() {
        return this.doaSearchIndex;
    }
    // 把getPosition改为public供外部调用
    public int getPosition() {
        return this.originalPosition;
    }
}
  • 第二步:修改HomeFragment.java中初始化数据的逻辑,存入原始索引
    找到循环创建DoaSearchIndex的代码段,修改为:
for (int i = 0; i < doasearchindex.length; i++) {
    // 新增第二个参数i,存入原始列表的位置
    DoaSearchIndex doaSearchIndex = new DoaSearchIndex(doasearchindex[i], i);
    arrayList.add(doaSearchIndex);
}
  • 第三步:修改onItemClick点击逻辑,使用原始索引判断跳转
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        // 先获取点击的条目对象,从中取出原始索引
        DoaSearchIndex clickedItem = (DoaSearchIndex) adapterView.getItemAtPosition(i);
        int originalPos = clickedItem.getPosition();
        Intent intent;
        // 用原始索引做跳转判断
        switch (originalPos){
            case 0:
                intent = new Intent(getActivity(), firstactivity.class);
                startActivity(intent);
                getId();
                break;
            case 1:
                intent = new Intent(getActivity(), secondactivity.class);
                startActivity(intent);
                getId();
                break;
            // 后续其他条目继续补充case即可
        }
        list.setVisibility(View.INVISIBLE);
    }
});

可选优化

如果后续条目数量多,硬编码switch维护麻烦,可以提前把对应Activity存入数组,直接根据原始索引读取跳转:

// 在HomeFragment中提前定义对应Activity数组
Class[] activityArr = new Class[]{firstactivity.class, secondactivity.class, 后续其他Activity.class};
// 点击时直接跳转无需写switch
Intent intent = new Intent(getActivity(), activityArr[originalPos]);
startActivity(intent);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 08:03:01