假设我在arraylist中有4个数据: 亚历克斯 黑色 巧克力 暗
当我输入文字以过滤它时,列表视图显示" alex",而不是巧克力。 我尝试了很多次,这是关于我的代码的结论: 每当我试图搜索只显示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();
}
}
}
}
当我将结果记录在数组列表中时(变量名=&#39;已过滤&#39;),我看到了正确的结果,但显示错误。
答案 0 :(得分:1)
替换
final String s = items.get(position);
通过
final String s = getItem(position);