【发布时间】:2020-12-06 09:59:24
【问题描述】:
我已经尝试了几种为我的 ListView 实现过滤/搜索功能的方法,但都不起作用。我希望有人可以帮助我。我正在尝试使当文本添加到 EditText 时,列表视图将根据添加的文本进行更改。例如,当我在 EditText 中输入 'c' 时,只有 'c' 会出现在带有图标的列表视图中。
更新:现在搜索过滤器工作正常,但是当我搜索一个字母时,图像与原始字母不匹配。请指教。
下面是所有的数组和数组列表。
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();
下面是带有 addTextChangedListener 的 EditText SearchFilter
EditText searchfilter = (EditText) root.findViewById(R.id.searchFilter);
searchfilter.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
customAdapter.getFilter().filter(charSequence);
}
@Override
public void afterTextChanged(Editable editable) {
}
});
下面是自定义适配器。
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;
}
}
据我了解,在 Filter() 代码中,我将过滤后的名称存储到 ArrayList TemporaryList() 中,然后将名称传递到字符串列表中。我担心的另一个问题是它只过滤文本而不过滤图像。任何帮助将不胜感激。
【问题讨论】:
-
您需要在适配器中提供
Filterable实现。也开始使用RecyclerView因为ListView现在是旧版小部件。 -
您之前刚刚问过这个问题:stackoverflow.com/questions/63433992/… 而您没有实施或对建议的更改做出反应。
-
抱歉,我曾尝试对其进行许多更改,但无济于事。因此,我试图为我的问题找到另一种解决方案,因为以前的解决方案不包括在 ListView 中过滤文本和图像。我希望所建议的更改将来也能对其他人有所帮助。
-
希望有人提供更好的解决方案来提供帮助,我将编辑另一个问题以适应此问题。
标签: android listview android-listview