【问题标题】:Custom ArrayAdapter Filtering for ListView issue when only 1 data show仅显示 1 个数据时 ListView 问题的自定义 ArrayAdapter 过滤
【发布时间】: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


    【解决方案1】:

    替换

    final String s = items.get(position);
    

    final String s = getItem(position);
    

    【讨论】:

    猜你喜欢
    • 2015-08-06
    • 2011-09-23
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多