【发布时间】:2015-02-23 02:00:35
【问题描述】:
假设我在 arraylist 中有 4 个数据: 亚历克斯 黑色的 巧克力 黑暗
当我输入文本以过滤“c”时,列表视图显示“alex”,而不是 chocolate。 我尝试了很多次,这是我对代码的结论: '每当我试图搜索只显示 1 个结果的单词时,listview 将始终显示 arraylist 的第一个数组' 请帮忙:(
这是我的适配器:
public class PesertaAdapter extends ArrayAdapter<String> {
public ArrayList<String> items;
public ArrayList<String> filtered;
private int layoutResourceId;
private Context context;
private Filter filter;
public PesertaAdapter(Context context, int layoutResourceId, ArrayList<String> items) {
super(context, layoutResourceId, items);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.filtered = items;
this.items = (ArrayList<String>) items.clone();
}
public static class ViewHolder {
public final TextView tvPeserta;
public final ImageButton mBtnDelete;
public ViewHolder (View view) {
tvPeserta = (TextView) view.findViewById(R.id.text1);
mBtnDelete = (ImageButton) view.findViewById(R.id.btnDel);
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder viewHolder = null;
if(row == null){
LayoutInflater inflater = LayoutInflater.from(context);
row = inflater.inflate(layoutResourceId, null);
viewHolder = new ViewHolder(row);
row.setTag(viewHolder);
}
viewHolder = (ViewHolder) row.getTag();
final String s = items.get(position);
viewHolder.tvPeserta.setText(s);
viewHolder.mBtnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "isi: " + s, Toast.LENGTH_SHORT).show();
}
});
return row;
}
@Override
public Filter getFilter() {
if(filter == null){
filter = new PesertaFilter();
}
return filter;
}
private class PesertaFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if(constraint == null || constraint.length() == 0){
ArrayList<String> list = new ArrayList<>();
synchronized (this) {
list.addAll(items);
}
results.values = list;
results.count = list.size();
}else{
String prefixString = constraint.toString();
ArrayList<String> filt = new ArrayList<>();
ArrayList<String> lItems = new ArrayList<>();
synchronized (this) {
lItems.addAll(items);
}
for (int i = 0; i < lItems.size(); i++) {
final String value = lItems.get(i);
Log.d("ASD", "VALUE: " + value);
if (value.startsWith(prefixString)) {
Log.d("ASD", "VALUEMATCH: " + value);
filt.add(value);
}
}
results.values = filt;
results.count = filt.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filtered = (ArrayList<String>) results.values;
if (results.count > 0) {
notifyDataSetChanged();
clear();
for(int i = 0; i<results.count; i++){
Log.d("ASD", "FILTERED: " + filtered.get(i));
add(filtered.get(i));
notifyDataSetInvalidated();
}
} else {
notifyDataSetChanged();
clear();
add("Not found");
notifyDataSetInvalidated();
}
}
}
}
当我在数组列表(变量名='filtered')中记录结果时,我看到了正确的结果,但显示错误。
【问题讨论】:
标签: android listview arraylist filter filtering