Jod*_*oda 1 android listview filter android-arrayadapter
我实际上试图用文本过滤我的ListView.
如果我输入内容,结果会被过滤,但如果我再次删除我键入的文本,则列表为空.:(
你知道我怎么解决这个问题吗?
这是迄今为止的代码:
public class ResultsArrayAdapter extends ArrayAdapter<SuchErgebnis> {
    Context myContext;
    int layoutResourceId;
    ArrayList<SuchErgebnis> ergebnisListeOriginal = null;
    ArrayList<SuchErgebnis> ergebnisListeGefiltert = null;
    private Filter filter;
    public ResultsArrayAdapter(Context context, int textViewResourceId,
            ArrayList<SuchErgebnis> objects) {
        super(context, textViewResourceId, objects);
        this.myContext = context;
        this.layoutResourceId = textViewResourceId;
        this.ergebnisListeOriginal = objects;
        this.ergebnisListeGefiltert = objects;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ErgebnisHolder eHolder = null;
        SuchErgebnis ergebnis = ergebnisListeGefiltert.get(position);
        if (row == null) // Wird zum ersten Mal gelanden...
        {
            LayoutInflater inflater = (LayoutInflater) myContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.ergebnis_list_item, parent, false);
            eHolder = new ErgebnisHolder();
            eHolder.eTitel = (TextView) row
                    .findViewById(R.id.ergebnis_list_item_textview_titel);
            eHolder.eInfo = (TextView) row
                    .findViewById(R.id.ergebnis_list_item_textview_info);
            eHolder.eTreffer = (TextView) row
                    .findViewById(R.id.ergebnis_list_item_textview_treffer);
            row.setTag(eHolder);
        } else { // Wurde schoneinmal geladen, Views sind noch gespeichert...
            eHolder = (ErgebnisHolder) row.getTag();
        }
        eHolder.eTitel.setText(ergebnis.titel);
        eHolder.eInfo.setText(ergebnis.info != null ? ergebnis.info : "");
        eHolder.eTreffer.setText(ergebnis.treffer != null ? ergebnis.treffer
                : "");
        row.setPadding(
                ergebnis.isChild ? Main.mFHelper
                        .getPixels(10 * ergebnis.childNumber) : 0, 0, 0, 0);
        return row;
    }
    @Override
    public Filter getFilter() {
        if (filter == null) {
            filter = new ResultFilter();
        }
        return filter;
    }
    static class ErgebnisHolder {
        TextView eTitel;
        TextView eInfo;
        TextView eTreffer;
    }
    private class ResultFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            String filterText = constraint.toString().toLowerCase();
            if (filterText == null || filterText.length() == 0) {
                synchronized (this) {
                    results.values = ergebnisListeOriginal;
                    results.count = ergebnisListeOriginal.size();
                }
            } else {
                ArrayList<SuchErgebnis> gefilterteListe = new ArrayList<SuchErgebnis>();
                ArrayList<SuchErgebnis> ungefilterteListe = new ArrayList<SuchErgebnis>();
                synchronized (this) {
                    ungefilterteListe.addAll(ergebnisListeOriginal);
                }
                for (int i = 0, l = ungefilterteListe.size(); i < l; i++) {
                    SuchErgebnis m = ungefilterteListe.get(i);
                    if (m.titel.toLowerCase().contains(filterText)) {
                        gefilterteListe.add(m);
                    }
                }
                results.values = gefilterteListe;
                results.count = gefilterteListe.size();
            }
            return results;
        }
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            ergebnisListeGefiltert = (ArrayList<SuchErgebnis>) results.values;
//          notifyDataSetChanged();
            clear();
            for (int i = 0, l = ergebnisListeGefiltert.size(); i < l; i++)
                add(ergebnisListeGefiltert.get(i));
//          notifyDataSetInvalidated();
        }
    }
}
编辑://
过滤器由简单的Textwatcher调用
private TextWatcher filterTextWatcher = new TextWatcher() {
    public void afterTextChanged(Editable s) {
    }
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        mAdapter.getFilter().filter(s);
    }
};
我将其添加到EditText中
etFilter.addTextChangedListener(filterTextWatcher);
我的解决方案
 public class ResultsArrayAdapter extends ArrayAdapter<SuchErgebnis> {
    Context myContext;
    int layoutResourceId;
    ArrayList<SuchErgebnis> ergebnisListeOriginal = null;
    ArrayList<SuchErgebnis> ergebnisListeGefiltert = null;
    private Filter filter;
    public ResultsArrayAdapter(Context context, int textViewResourceId,
            ArrayList<SuchErgebnis> objects) {
        super(context, textViewResourceId, objects);
        this.myContext = context;
        this.layoutResourceId = textViewResourceId;
        this.ergebnisListeOriginal = new ArrayList<SuchErgebnis>(objects);
        this.ergebnisListeGefiltert = new ArrayList<SuchErgebnis>(objects);
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ErgebnisHolder eHolder = null;
        SuchErgebnis ergebnis = ergebnisListeGefiltert.get(position);
        if (row == null) // Wird zum ersten Mal gelanden...
        {
            LayoutInflater inflater = (LayoutInflater) myContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.ergebnis_list_item, parent, false);
            eHolder = new ErgebnisHolder();
            eHolder.eTitel = (TextView) row
                    .findViewById(R.id.ergebnis_list_item_textview_titel);
            eHolder.eInfo = (TextView) row
                    .findViewById(R.id.ergebnis_list_item_textview_info);
            eHolder.eTreffer = (TextView) row
                    .findViewById(R.id.ergebnis_list_item_textview_treffer);
            row.setTag(eHolder);
        } else { // Wurde schoneinmal geladen, Views sind noch gespeichert...
            eHolder = (ErgebnisHolder) row.getTag();
        }
        eHolder.eTitel.setText(ergebnis.titel);
        eHolder.eInfo.setText(ergebnis.info != null ? ergebnis.info : "");
        eHolder.eTreffer.setText(ergebnis.treffer != null ? ergebnis.treffer
                : "");
        row.setPadding(
                ergebnis.isChild ? Main.mFHelper
                        .getPixels(10 * ergebnis.childNumber) : 0, 0, 0, 0);
        return row;
    }
    @Override
    public Filter getFilter() {
        if (filter == null) {
            filter = new ResultFilter();
        }
        return filter;
    }
    static class ErgebnisHolder {
        TextView eTitel;
        TextView eInfo;
        TextView eTreffer;
    }
    @Override
    public int getCount() {
        return ergebnisListeGefiltert.size();
    }
    @Override
    public SuchErgebnis getItem(int position) {
        return ergebnisListeGefiltert.get(position);
    }
    private class ResultFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            String filterText = constraint.toString().toLowerCase();
            if (filterText == null || filterText.length() == 0) {
                synchronized (this) {
                    results.values = ergebnisListeOriginal;
                    results.count = ergebnisListeOriginal.size();
                }
            } else {
                ArrayList<SuchErgebnis> gefilterteListe = new ArrayList<SuchErgebnis>();
                ArrayList<SuchErgebnis> ungefilterteListe = new ArrayList<SuchErgebnis>();
                synchronized (this) {
                    ungefilterteListe.addAll(ergebnisListeOriginal);
                }
                for (int i = 0, l = ungefilterteListe.size(); i < l; i++) {
                    SuchErgebnis m = ungefilterteListe.get(i);
                    if (m.titel.toLowerCase().contains(filterText)) {
                        gefilterteListe.add(m);
                    }
                }
                results.values = gefilterteListe;
                results.count = gefilterteListe.size();
            }
            return results;
        }
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            ergebnisListeGefiltert = (ArrayList<SuchErgebnis>) results.values;
            if(results.count > 0)
            {
                notifyDataSetChanged();
            }else{
                notifyDataSetInvalidated();
            }
        }
    }
    }
| 归档时间: | 
 | 
| 查看次数: | 4067 次 | 
| 最近记录: |