Java Android Studio ListView筛选与图像不匹配的文本

Java Android Studio ListView筛选与图像不匹配的文本,java,android,Java,Android,我已经尝试了几种为我的ListView实现过滤/搜索功能的方法,但都不起作用。我希望有人能帮我。我试图使它成为这样,当文本被添加到EditText中时,listview将根据添加的文本进行更改。对于exmaple,当我在编辑文本中输入“c”时,只有“c”会出现在带有图标的列表视图中 更新:现在搜索过滤器工作正常,但当我搜索一个字母时,图像与原始字母不匹配。请告知 下面是所有数组和ArrayList的列表 String Names[] = {"a", "b"

我已经尝试了几种为我的ListView实现过滤/搜索功能的方法,但都不起作用。我希望有人能帮我。我试图使它成为这样,当文本被添加到EditText中时,listview将根据添加的文本进行更改。对于exmaple,当我在编辑文本中输入“c”时,只有“c”会出现在带有图标的列表视图中

更新:现在搜索过滤器工作正常,但当我搜索一个字母时,图像与原始字母不匹配。请告知

下面是所有数组和ArrayList的列表

String Names[] = {"a", "b", "c", "d", "e"};
int Images[] = {R.drawable.icon1, R.drawable.icon2, R.drawable.icon3, 
R.drawable.icon4, R.drawable.icon5};
ArrayList<String> filteredList;
String temporaryList[] = devicesName.clone();
下面是自定义适配器

class CustomAdapter extends BaseAdapter {
@Override
public int getCount() {
    return Names.length;
}

@Override

public Object getItem(int i) {
    return null;
}

@Override
public long getItemId(int i) {
    return 0;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {

    view = getLayoutInflater().inflate(R.layout.row, null);

    TextView textView_name = (TextView) view.findViewById(R.id.PhoneName);
    ImageView imageView = (ImageView) view.findViewById(R.id.imagePhone);


    textView_name.setText(Names[i]);
    imageView.setImageResource(Images[i]);
    

        return view;

}

    @Override
    public Filter getFilter() {

        Filter filter = new Filter() {

            @SuppressWarnings("unchecked")
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {

                FilterResults results = new FilterResults();
                ArrayList<String> FilteredArrayNames = new ArrayList<String>();

                // perform your search here using the searchConstraint String.
                if (constraint == null || constraint.length() == 0){
                    FilteredArrayNames.addAll(Arrays.asList(temporaryList));
                } else{

                constraint = constraint.toString().toLowerCase();
                for (int i = 0; i < temporaryList.length; i++) {
                    String dataNames = temporaryList[i];
                    if (dataNames.toLowerCase().startsWith(constraint.toString()))  {
                        FilteredArrayNames.add(dataNames);
                    }
                }
                }
                results.count = FilteredArrayNames.size();
                results.values = FilteredArrayNames;
                Log.e("VALUES", results.values.toString());

                return results;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {

                temporaryList = (ArrayList<String>) results.values;
                Names = new String[temporaryList.size()];
                temporaryList.toArray(Names);
                notifyDataSetChanged();


            }
        };


        return filter;
    }
}
class CustomAdapter扩展了BaseAdapter{
@凌驾
public int getCount(){
返回name.length;
}
@凌驾
公共对象getItem(int i){
返回null;
}
@凌驾
公共长getItemId(int i){
返回0;
}
@凌驾
公共视图getView(int i、视图视图、视图组视图组){
视图=GetLayoutFlater()。充气(R.layout.row,null);
TextView TextView_name=(TextView)view.findViewById(R.id.PhoneName);
ImageView=(ImageView)view.findViewById(R.id.imagePhone);
textView_name.setText(名称[i]);
setImageResource(Images[i]);
返回视图;
}
@凌驾
公共过滤器getFilter(){
过滤器过滤器=新过滤器(){
@抑制警告(“未选中”)
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults results=新的FilterResults();
ArrayList FilteredArrayNames=新建ArrayList();
//使用searchConstraint字符串在此处执行搜索。
if(constraint==null | | constraint.length()==0){
FilteredaryNames.addAll(Arrays.asList(temporaryList));
}否则{
constraint=constraint.toString().toLowerCase();
for(int i=0;i

据我所知,在Filter()代码中,我将过滤后的名称存储到ArrayList TemporaryList()中,然后将名称传递到字符串列表中。我担心的另一个问题是,它只过滤文本而不过滤图像。任何帮助都将不胜感激。

看起来您只是在过滤后更新
临时列表

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

            temporarylist = (ArrayList<String>) results.values;
            notifyDataSetChanged();
        }
@SuppressWarnings(“未选中”)
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
临时列表=(ArrayList)results.values;
notifyDataSetChanged();
}
我根本看不出listview是如何依赖于
临时列表的。甚至
getCount()
也是基于
设备的

更改
getCount()
getView()
以反映
临时列表中的数据,而不是
设备中的数据

另外,不要忘记将
临时列表
初始化为
设备
的副本,以便初始状态为所有设备都显示在列表视图中

更新

要解决错误图像的问题,请将临时列表更改为int类型的列表,然后在进行筛选时,不要将设备名称存储到列表中,而是将这些名称的索引存储在设备的完整列表中


然后,使用这些索引获取正确的名称和图像,以将它们插入视图

String devices[…]…
Ok。这些是你的设备<代码>设置文本(标题[i])什么是标题<代码>临时列表=(ArrayList)results.values你在哪里使用该列表?已经做了必要的更改。是吗?我不这么认为。你还是不用临时名单。如果让设备[]保持不变,那么当getView使用设备[]时,您希望得到什么?我们再次进行了更改,但现在出现了错误。java.util.ArrayList不能强制转换为java.lang.String[]。请为行
customAdapter.getFilter().filter(charSequence)提供
getFilter()
方法非常感谢您的帮助。但是我不太确定怎么做,你能举个例子吗?我想知道它是否同时适用于文本和图像。再次感谢。此问题已修复,但现在有一个新问题。太好了!如果这是一个新的不相关的问题-接受答案并提出一个新问题。并将其链接起来,以便我(和其他人)可以跟随。是的,我已经编辑了这个问题。我想知道你是否有解决办法。图像不跟随原始筛选名称。谢谢。我不太清楚怎么做,你能提供一个完整的例子吗?非常感谢。
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

            temporarylist = (ArrayList<String>) results.values;
            notifyDataSetChanged();
        }