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
相关产品推荐
相关产品推荐

