仅显示1个数据时自定义ArrayAdapter过滤ListView问题

时间:2014-12-25 08:34:40

标签: android listview arraylist filter filtering

假设我在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;),我看到了正确的结果,但显示错误。

1 个答案:

答案 0 :(得分:1)

替换

final String s = items.get(position);

通过

final String s = getItem(position);