在Android中搜索ListView项目后,始终打开ListView的第一个项目(问题)

2023-11-29

当我打开搜索到的项目时,它打开的是 ListView 的第一个项目,而不是搜索到的项目。即使搜索并成功找到该项目。

让我举几个例子:

  • 如果我搜索Arrow,我可以得到Arrow但当点击时Arrow它将会Almost Human, Almost Human是我的 ListView 的第一项
  • 如果我搜索American我越来越The Americans (first) and American Horror Story (second)(两个结果) 搜索过程成功,但如果单击The Americans (second one)它转到 ListView 的第二项。

我缺少什么?

我的搜索代码:

    search.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            // When user changed the Text
            MainActivity.this.adapter.getFilter().filter(cs);   
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub                          
        }
    });
}

这是 CustomListViewAdapter.java

    public class CustomListViewAdapter extends ArrayAdapter<RowItem> {
Context context;

public CustomListViewAdapter(Context context, int resourceId,
        List<RowItem> items) {
    super(context, resourceId, items);
    this.context = context;
}

/* private view holder class */
private class ViewHolder {
    ImageView imageView;
    TextView txtTitle;
    TextView txtDesc;
}

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    RowItem rowItem = getItem(position);    

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();
        holder.txtDesc = (TextView) convertView.findViewById(R.id.desc);
        holder.txtTitle = (TextView) convertView.findViewById(R.id.title);
        holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
        convertView.setTag(holder);
    } else
        holder = (ViewHolder) convertView.getTag();

    holder.txtDesc.setText(rowItem.getDesc());
    holder.txtTitle.setText(rowItem.getTitle());
    // holder.imageView.setImageBitmap(rowItem.getImageId());

    ImageView img = (ImageView) convertView.findViewById(R.id.icon);
    ImageView gif = (ImageView) convertView.findViewById(R.id.icon);
    // UrlImageViewHelper.loadUrlDrawable(context, rowItem.getImageId());

    Ion.with(gif).load("http://www.example.com/wp-content/uploads/2014/03/android-icon/loading.gif");
    Drawable drawable=gif.getDrawable();
    UrlImageViewHelper.setUrlDrawable(img, rowItem.getImageId(),drawable,
            600000);
    return convertView;
}
    }

RowItem.java

        public class RowItem<T> {
        private String imageId;
        private String title;
        private String desc;

        public RowItem(String imageId, String title, String desc) {
            this.imageId = imageId;
            this.title = title;
            this.desc = desc;
        }
        public String getImageId() {
            return imageId;
        }
        public void setImageId(String imageId) {
            this.imageId = imageId;
        }
        public String getDesc() {
            return desc;
        }
        public void setDesc(String desc) {
            this.desc = desc;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        @Override
        public String toString() {
            return title + "\n" + desc;
        }
    }   

MainActiviy.java

            protected void onCreate(Bundle onSaveInstanceState ) {
    super.onCreate(onSaveInstanceState );
    setContentView(R.layout.activity_main);
        listView.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            // When clicked, Open the Next Screen
            Intent r = new Intent(MainActivity.this, KategoriActivity.class);
            r.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            r.putExtra("cat_img", asd[2][position]);
            r.putExtra("cat_id", asd[1][position]);
            r.putExtra("cat_id2", asd[1][position]);
            r.putExtra("cat_name",asd[0][position]);
            // r.putExtra("cat_img", bit[1][position]);
            startActivityForResult(r, position);


        }

    }); 


    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        try {

            JSONArray jsonResponse = new JSONArray(result);
            asd = new String[3][jsonResponse.length()];
            rowItems = new ArrayList<RowItem>();

            for (int i = 0; i < jsonResponse.length(); i++) {
                JSONObject js = jsonResponse.getJSONObject(i);
                asd[0][i] = js.getString("Category_Name");
                asd[2][i] = js.getString("Image");
                asd[1][i] = js.getString("Term_ID");

                RowItem item = new RowItem(asd[2][i], asd[0][i], "");
                rowItems.add(item);
            }

            adapter = new CustomListViewAdapter(MainActivity.this,
                    R.layout.list_item, rowItems);

            listView.setAdapter(adapter);


        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

希望你能帮我..


通常,如果您有一个自定义类型的 ArrayAdapter,例如RowItem它不会自动为您处理过滤。毕竟,它怎么知道哪个属性RowItem过滤?你应该覆盖getFilter方法,并将过滤后的列表与适配器中的总体列表分开存储。像这样的东西:

public class CustomListViewAdapter extends ArrayAdapter<RowItem>
{
    private final ArrayList<RowItem>  mItems;
    private       ArrayList<RowItem>  mFilteredItems;
    private final Comparator<Object> mComparator;

    public CustomListViewAdapter(Context context, int textViewResourceId, List<RowItem> items)
    {
        super(context, textViewResourceId);

        mItems = new ArrayList<RowItem>(items);
        mFilteredItems = new ArrayList<RowItem>(items);
        mComparator = new Comparator<Object>()
        {
            @Override
            public int compare(Object o1, Object o2)
            {
                String s1 = ((RowItem)o1).getTitle();
                String s2 = ((RowItem)o2).getTitle();
                return s1.toLowerCase(Locale.getDefault()).compareTo(s2.toLowerCase());
            }
        };

        Collections.sort(mItems, mComparator);
        Collections.sort(mFilteredItems, mComparator);
    }

    @Override
    public int getCount()
    {
        return mFilteredItems.size();
    }

    @Override
    public RowItem getItem(int position)
    {
        return mFilteredItems.get(position);
    }

    @Override
    public int getPosition(RowItem item)
    {
        return mFilteredItems.indexOf(item);
    }

    @Override
    public Filter getFilter()
    {
        return new Filter()
        {
            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results)
            {
                mFilteredItems = (ArrayList<RowItem>)results.values;
                if (results.count > 0)
                {
                    notifyDataSetChanged();
                }
                else
                {
                    notifyDataSetInvalidated();
                }
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint)
            {
                List<RowItem> filteredResults = new ArrayList<RowItem>();
                for (RowItem item : mItems)
                {
                    if (item.getTitle().toLowerCase(Locale.getDefault()).contains(constraint.toString().toLowerCase(Locale.getDefault())))
                    {
                        filteredResults.add(item);
                    }
                }

                Collections.sort(filteredResults, mComparator);
                FilterResults results = new FilterResults();
                results.values = filteredResults;
                results.count = filteredResults.size();

                return results;
            }
        };
    }
}

并在主活动中:

        RowItem item = adapter.getItem(position)
        r.putExtra("cat_img", item.getImageId());
        r.putExtra("cat_id", item.getTermId());
        r.putExtra("cat_id2", item.getTermId());
        r.putExtra("cat_name", item.getTitle());

您还必须向 RowItem 添加一个 termid 字段,因为它位于您的 JSON 响应中...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Android中搜索ListView项目后,始终打开ListView的第一个项目(问题) 的相关文章

随机推荐

  • 代理验证失败错误

    我正在尝试通过 FTP 站点代理访问 FTP 服务器以绕过防火墙it sauronsoftware ftp4j FTPClient我知道我的用户名 密码是正确的 因为我可以使用 FileZilla 进行连接 我尝试使用Authenticat
  • 如何编写多线程函数来同时处理不同的任务?

    我想定义一个do in parallelpython 中的函数将接受带参数的函数 为每个函数创建一个线程并并行执行它们 该函数应该像这样工作 do in parallel sleep 3 sleep 8 sleep 3 然而我很难定义do
  • WPF 数字 UpDown 控件在哪里?

    进入第一个严肃的 WPF 项目 似乎有很多基本的控件都缺失了 具体来说 我正在寻找 Numeric UpDown 控件 我是否错过了乐队外的发行 真的不想写自己的控件 我不想使用 WindowsFormHost 并在其上放置 WinForm
  • “mvn clean install”与“mvn install”有何不同?

    有什么区别mvn clean install and mvn install clean是 Maven 中自己的构建生命周期阶段 可以将其视为操作或任务 mvn clean install告诉 Maven 做clean运行之前每个模块中的阶
  • 如何使用 JsonFormat 将 Jackson Json NULL 字符串反序列化为日期

    我已经看了很多 但到目前为止仍然无法得到答案 非常感谢任何帮助 我有一个简单的String to Date字段映射并尝试将 JSON 字符串读取到 Java 对象 JsonInclude value Include NON EMPTY Js
  • 谷歌电子表格“查询”功能可以在谷歌应用程序脚本中使用吗?

    我正在寻找一种以编程方式填充电子表格的方法 该电子表格根据登录用户过滤另一个电子表格中的数据 我可以使用电子表格中的查询功能来完成此操作 但是 无法找到从应用程序脚本调用查询函数的方法 这可以做到吗 将不胜感激示例代码 谢谢 不知道有没有限
  • 返回之前的 JPanel

    我继承了代码 并且由于需要长时间解释的原因 我需要使用空布局 我一直在尝试利用他们在 JPanels 之间导航的内容 我一直不知道怎么做 这就是我现在所拥有的 它被编译成下面的 SSCCE 我试图做的是将 JPanel 添加到 ArrayL
  • 多类分类中负例的经验法则

    在多类分类任务中 对于表示 其他所有内容 的标签 样本数量应该有多大 是否有一个经验法则 示例 我想将我的输入分类为以下之一X类 这X 1当输入为 以上都不是 时 类将激活 假设我的数据集包含 10 个 正 类别中每个类别的 5 000 个
  • 将 KML 文件读入 R

    我正在构建一个工作流程 用于将多几何 KML 文件读取到 R 中 这是我的工作地图 具有点和路径几何形状 可重现的 R 脚本是 library rgdal setwd SPECIFY A FOLDER download file http
  • 在Python中删除字符

    有人知道如何删除特定字符后面的所有字符吗 像这样 http google com translate t into http google com 如果您询问的是抽象字符串而不是网址 您可以使用 gt gt gt astring http
  • 为什么 set -e 不会导致 `false || 失败假&&真`? [复制]

    这个问题在这里已经有答案了 无法找出合适的标题 我不明白 dash bash 中的行为 也就是说 我使用 set e 在命令失败时进行救援 并使用命令组来处理积极结果 IE 总体方案是 wantcommand command Than 意味
  • 如何在 Windows Phone 项目中导入 C++ dll

    我用 C 创建了一个 DLL 文件 我想将其导入到我的 Windows Phone 项目中 我遵循了来自不同来源的许多说明 即使当我运行我的代码时 我也会收到以下错误 尝试访问该方法失败 rough MainPage Add System
  • python openpyxl读取excel太慢

    我有一个 xlsx 文件 拥有 1841 行 每行有 30 列 使用 openpyxl 将整个信息保存到列表中 def get value i ws article row value ws cell row article row col
  • 是否有可能在 python 中找到 [a,b] 范围内的随机浮点数?

    我试图在 python 中生成 0 8 0 9 范围内的随机浮点数 但不幸的是 我发现的所有工具只能生成 a b 范围内的浮点数随机数 喜欢Random uniform a b 与此同时 我尝试做这样的事情 uniform 0 8 0 90
  • TypeScript 类型特定字符的字符串

    假设我想允许使用十六进制字符串 所以唯一允许的值为 0 9a f TypeScript 有没有办法定义只接受某些字符串的类型字符串 IE valid const valid HexString 123abc invalid const in
  • System.DateTime.Now 和 System.DateTime.Today 之间的区别

    谁能解释一下两者之间的区别System DateTime Now and System DateTime Today在 C NET 中 如果可能的话 各有利弊 DateTime Now返回一个DateTime由运行代码的计算机的本地日期和时
  • Google Apps 脚本 - MailApp

    我想使用 Google Apps 脚本发送一封带有replyTo 和附件的电子邮件 但我只找到了这两种方法 它们分别执行我想要的操作 sendEmail recipient subject body options sendEmail to
  • Java GraphTraversal 输出 Gremlin 查询

    如何从 Java 输出 Gremlin 查询GraphTraversal目的 默认输出 graphTraversal toString 好像 HasStep label eq brand name eq Nike status within
  • 将 int 转换为 hex,然后转换为 00 00 00 00 的格式

    我有一个递增的整数 然后我想要十六进制 所以我像这样进行转换 myInt ToString X 然后我需要一个格式为 00 00 00 00 的字符串 但我无法找到一种方法将我现在拥有的十六进制字符串转换为这种格式 使用 Linq 查询 您
  • 在Android中搜索ListView项目后,始终打开ListView的第一个项目(问题)

    当我打开搜索到的项目时 它打开的是 ListView 的第一个项目 而不是搜索到的项目 即使搜索并成功找到该项目 让我举几个例子 如果我搜索Arrow 我可以得到Arrow但当点击时Arrow它将会Almost Human Almost H