【问题标题】:Invalid result page when click on search result item单击搜索结果项时结果页面无效
【发布时间】:2018-08-24 13:00:51
【问题描述】:

ArrayList 自定义类

ArrayList<ItemClass> nomenclatureList

有它的 onItemClickListener

   listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
        ItemClass word = nomenclatureList.get(position);
        int singleImg = word.getImageResourse();
        String singleName = word.getNomenclatureName();
        String singleWeight = word.getNomenclatureWeight();
        String singleBrand = word.getNomeclatureBrand();
        String singleBar = word.getNomenclatureBarCode();
        String singlePercent = word.getNomenclaturePercent();
        String singleComposition = word.getNomenclatureComposition();
        String singlePack = word.getNomenclaturePack();
        Intent intent = new Intent(ItemListGKI.this, ItemSingle.class);
        intent.putExtra("SINGLE_IMG_KEY", singleImg);
        intent.putExtra("SINGLE_NAME_KEY", singleName);
        intent.putExtra("SINGLE_WEIGHT_KEY", singleWeight);
        intent.putExtra("SINGLE_BRAND_KEY", singleBrand);
        intent.putExtra("SINGLE_BAR_KEY", singleBar);
        intent.putExtra("SINGLE_PERCENT_KEY", singlePercent);
        intent.putExtra("SINGLE_COMPOSITION_KEY", singleComposition);
        intent.putExtra("SINGLE_PACK_KEY", singlePack);
        startActivity(intent);
    }
});

还有从这个 ArrayList 中搜索的代码

    @Override
        public boolean onQueryTextChange(String newText) {
            boolean success = false;
            ArrayList<String> tempList = new ArrayList<>();
            for(ItemClass temp : nomenclatureList){
                if(temp.getNomenclatureName().toLowerCase().contains(newText.toLowerCase())){
                    tempList.add(temp.getNomenclatureName());
                    ArrayAdapter<String> adapter = new ArrayAdapter<>(ItemListGKI.this, android.R.layout.simple_list_item_1, tempList);
                    listView.setAdapter(adapter);
                    tempList.size();
                    success = true;
                }
            }
        return success;
    }

当我点击搜索结果项目时,打开的活动信息错误。如果我在不使用搜索的情况下单击项目 - 一切正常。

我不知道我必须做些什么来修复它。

【问题讨论】:

  • 我必须把它放在哪里?
  • adapterView.getAdapter().getItem(position) 不工作。
  • 我添加了一个新的解决方案,我认为它现在可以工作了

标签: java android search arraylist


【解决方案1】:

替换这个:

ItemClass word = nomenclatureList.get(position);

有了这个

ItemClass word = (ItemClass) adapterView.getItemAtPosition(position);

为什么?因为当您搜索或过滤数据时,命名列表的数据与设置的适配器不同,所以 nomenclatureList.get(5) 例如不同于 (ItemClass) adapterView.getItemAtPosition(position);

现在你应该在 onQueryTextChange 中输入:

 @Override
        public boolean onQueryTextChange(String newText) {
            boolean success = false;
            ArrayList<ItemClass> tempList = new ArrayList<>();
            for(ItemClass temp : nomenclatureList){
                if(temp.getNomenclatureName().toLowerCase().contains(newText.toLowerCase())){
                    tempList.add(temp);
                }
            }
             ArrayAdapter<String> adapter = new ArrayAdapter<>(ItemListGKI.this, android.R.layout.simple_list_item_1, tempList);
             listView.setAdapter(adapter);
             tempList.size();
             if(tempList.size() > 0){
                success = true;
            }
        return success;
    }

【讨论】:

  • 当我点击搜索时,使用 ItemClass word = (ItemClass) adapterView.getItemAtPosition(position) 应用程序崩溃 - 项目。 java.lang.ClassCastException:java.lang.String 无法在 ru.renna.amkk.ItemListGKI$1.onItemClick(ItemListGKI.java:147) 处转换​​为 ru.renna.amkk.ItemClass
  • 哦,这意味着它正在工作,我会用解决方案告诉你为什么
  • 错误是因为您在这里创建了字符串数组tempList.add(temp.getNomenclatureName());,并且您需要 ItemClasses 数组才能使这项工作ItemClass word = (ItemClass) adapterView.getItemAtPosition(position); 因为您看到它需要一个项目类而不是字符串@АртемИльинский
  • 所以,现在对我来说非常复杂......我在 java 中大约 2 周。非常感谢您的帮助,但我已经不愿意向您寻求帮助了。
  • 试试上面的方法,它会起作用的 :) 不客气
【解决方案2】:

根据此处定义的 API -> https://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener

onItemClick(AdapterView<?> adapterView, View view, int position, long id)

您的代码正在考虑使用position 检索被点击的项目。我相信它应该是id。尝试替换

ItemClass word = nomenclatureList.get(position);

ItemClass word = nomenclatureList.get(id);

【讨论】:

  • "不能长期申请"
  • 然后使用new Long(id).intValue() 将那个长的id 转换为int。这是因为您使用 ArrayList 来存储信息。这里没有信息丢失,因为 ArrayList 的最大大小是 Integer.MAX_VALUE。
猜你喜欢
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2021-03-13
  • 1970-01-01
  • 2016-04-07
相关资源
最近更新 更多