带有过滤器的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自定义列表视图不起作用的主要内容,如果未能解决你的问题,请参考以下文章