带有过滤器的Android自定义列表视图不起作用

Posted

技术标签:

【中文标题】带有过滤器的Android自定义列表视图不起作用【英文标题】:Android Custom Listview with Filter not working 【发布时间】:2021-09-02 22:06:16 【问题描述】:

我有一个自定义列表视图,想用它过滤记录。请帮忙。我想按名称过滤 stident 记录。

我尝试了多种互联网上可用的选项,但没有一个有效。

我的主要活动(这里是学生活动)代码:

String[] arr_uid = new String[50];
String[] arr_name = new String[50];
String[] arr_mobile = new String[50];
// these arrays are populated form database then

 Student_custom_Adapter adapter = new Student_custom_Adapter(StudentActivity.this, arr_uid, arr_name, arr_mobile);

                list = (ListView) findViewById(R.id.lv_student);
                list.setAdapter(adapter);

我的自定义适配器类:

public class Customer_custom_Adapter extends ArrayAdapter<String>
    private final Activity context;
    private final String[] uid1;
    private final String[] mobile;
    private final String[] name;
    

    public Student_custom_Adapter(Activity context, String[] uid, String[] name , String[] mobile, ) 
        super(context, R.layout.custom_students, uid);
        // TODO Auto-generated constructor stub

        this.context=context;
        this.uid1= uid;
        this.mobile = mobile;
        this.name= name;
       

    


    public View getView(int position, View view, ViewGroup parent) 

        String finaldate;
        LayoutInflater inflater=context.getLayoutInflater();
        View rowView=inflater.inflate(R.layout.custom_student, null,true);


        
        TextView tv_uid = (TextView) rowView.findViewById(R.id.tv_cust_uid);
        TextView tv_name = (TextView) rowView.findViewById(R.id.tv_cust_name);
         TextView tv_mobile = (TextView) rowView.findViewById(R.id.tv_cust_mobile) ;
        
       
           tv_uid.setText("ID: "+ uid[position]);
            tv_name.setText("Name: "+name[position]);
            tv_mobile.setText("Mobile : "+mobile[position]);
           
        

        return rowView;



    ;

【问题讨论】:

【参考方案1】:

您必须自己过滤它,然后使用过滤后的数组更新适配器中的数组。类似于以下内容:

StudentActivity.java

...

String[] arr_uid = new String[50];
String[] arr_name = new String[50];
String[] arr_mobile = new String[50];

...

private void filterList(String name) 
    String[] filter_uid = new String[50];
    String[] filter_name = new String[50];
    String[] filter_mobile = new String[50];
    int j = 0;
    for (String s : arr_name) 
        if (s != null && s.contains(name)) 
            filter_uid[j] = arr_uid[j];
            filter_name[j] = s;
            filter_name[j] = arr_mobile[j];
            ++j;
        
    
    adapter.updateList(filter_uid, filter_name, filter_mobile);

Customer_custom_Adapter.java

/* Do not declare as final */
private String[] uid1;
private String[] mobile;
private String[] name;

...

/* Add this method; call it to update your list */
public void updateList(String[] uid, String[] name, String[] mobile) 
    this.uid1= uid;
    this.mobile = mobile;
    this.name= name;
    notifyDataSetChanged();

【讨论】:

它应该可以工作。您是否正确编写了 Customer_custom_Adapter 的剩余部分?您是否正确填充了数组?最后,您必须在填充适配器后调用 filterString(someName)。 对不起,我一开始使用 counter ,然后用 j 代替了 i ,但把那两个地方滑了。现在我已经更正了。 感谢 Ananta 的及时帮助。很好,上面的代码没有崩溃,但不幸的是,当我输入任何要搜索的值时,系统会将所有记录中的名称值更改为“NULL” 我遇到了问题。我不得不稍微调整一下你的代码。实际上上面的代码是遍历 arr_name 、 arr_uid 和 arr_mobile 的。在上面的代码中,我们只在条件为真时增加变量 J 。但是,我们需要在 arr_name.arr_uid 和 arr_mobile 之间继续循环。所以这里是更新的代码:【参考方案2】:
int j = 0 ;

int temp =0;


for (String s : arr_name) 

    if (s != null && s.contains(name)) 

        filter_uid[j] = arr_uid[temp];

        filter_name[j] = arr_name[temp];

        filter_name[j] = arr_mobile[temp];

        ++j;
    

温度++;


【讨论】:

以上是关于带有过滤器的Android自定义列表视图不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将快餐栏中的 ImageView 宽度与 Android 中的自定义视图匹配父项不起作用

jQuery mobile折叠列表视图,搜索不起作用

android - listview 按位置获取项目视图

列表视图在android中不起作用

Android自定义视图不起作用

如果列表项有链接,setOnItemClickListener 不起作用