1

我实际上是在尝试用文本过滤我的 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);
4

1 回答 1

8

我的解决方案:

 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();
            }


        }

    }
    }
于 2012-12-11T13:21:20.423 回答