android过滤器自定义数组适配器并再次带回旧项目 [英] android filter custom array adapter and bring back old items again

查看:78
本文介绍了android过滤器自定义数组适配器并再次带回旧项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我实际上是在尝试用文本过滤ListView.

I am actually trying to filter my ListView with a text.

如果键入某些内容,结果将被过滤,但是如果再次删除键入的文本,则该列表为空. :(

If I type something, the results getting filtered, but if I delete my typed text again, the list is empty. :(

你知道我该怎么解决吗?

Do you know how I could fix that?

这是到目前为止的代码:

Here's the code so far:

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调用

The filter is called by a simple 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);
    }

};

我通过

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


        }

    }
    }

这篇关于android过滤器自定义数组适配器并再次带回旧项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆