如何同时使用Android的基本适配器来过滤列表项? [英] how to filter list items while using base adapter in android?

查看:218
本文介绍了如何同时使用Android的基本适配器来过滤列表项?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在寻找了很多关于通过编辑文本搜索列表视图中的项目,但我发现很多的问题类似我的问题,却处处被使用,也可以光标适配器上筛选结果从数据库中直接提取或者一些数组列表用了。

在我来说,我一直在使用几个阵列来传递文本使用基础adapter.as我从来没有做过这样的事情之前,我无法理解使用文本守望我的列表视图。

我调试的code和发现,发布结果的方法是没有得到征召,可能这就是为什么列表视图无法获得新的价值。
我一定要在名称阵列刷新值再次呼吁listviewadaptercontacts类中的文本改变了方法。

请帮忙。

 公共类AllContactsActivity扩展ListActivity工具
android.view.View.OnClickListener,OnItemClickListener {    LV的ListView;
    ListViewAdapterContacts LVA;
    的String []姓名,电话,身份证,类型;
    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){        super.onCreate(savedInstanceState);
        的LayoutParams PARAMS =新RelativeLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        的LinearLayout mainLayout =新的LinearLayout(本);
        mainLayout.setOrientation(LinearLayout.VERTICAL);
        LayoutInflater layoutInflater = getLayoutInflater();
        mainLayout.addView(layoutInflater.inflate(R.layout.allcontacts,NULL));
        mainLayout.addView(layoutInflater.inflate(R.layout.allbuttons,NULL));
        this.addContentView(mainLayout,则params);        configureBottomMenu();
        getContacts();        LV =新的ListView(getApplicationContext());
        LV =(ListView控件)findViewById(android.R.id.list);
        LVA =新ListViewAdapterContacts(这一点,名称,类型,电话,IDS); //传递数组类
        lv.setAdapter(LVA);
        等=(EditText上)findViewById(R.id.searchcontact);
        et.addTextChangedListener(新TextWatcher(){            公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){// TODO自动生成方法存根
                。lva.getFilter()过滤器(S);                lva.notifyDataSetInvalidated();
                lva.notifyDataSetChanged();
                lv.setAdapter(LVA);
            }            公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数,
                INT后){                // TODO自动生成方法存根            }            公共无效afterTextChanged(编辑S){
                // TODO自动生成方法存根
            }
        });        //一些code
    }
}


 公共类ListViewAdapterContacts扩展BaseAdapter实现过滤的{    私人ArrayFilter MFILTER;
    私人的ArrayList<字符串> mOriginalValues​​;
    私人最终对象MLOCK =新的对象();
    私人列表<字符串> mObjects;
    列表清单;    活动背景;
    的String []的名称;
    的String []类型;
    的String []号;
    的String [] IDS;
    公共ListViewAdapterContacts(Activity上下文,字符串[]名称,字符串[]类型的String []数字,字符串[] IDS){
        // TODO自动生成构造函数存根        this.context =背景;
        this.names =名称;
        this.types =类型;
        this.numbers =数;
        this.ids = IDS;
        对象[]数组=名称;
        清单= Arrays.asList(数组);
    }    公众诠释的getCount(){
        // TODO自动生成方法存根
        如果(名称== NULL){
            返回0;
        }其他{
            返回names.length;
        }
    }    公共对象的getItem(INT位置){
        // TODO自动生成方法存根
        返回null;
    }    众长getItemId(INT位置){
        // TODO自动生成方法存根
        返回0;
    }    公共类viewHolder {
        TextView的顶部;
        TextView的底部;
        TextView的缺点;
        TextView的基础;
    }    公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        // TODO自动生成方法存根
        viewHolder持有人;
        如果(convertView == NULL){            LayoutInflater充气= context.getLayoutInflater();
            convertView = inflator.inflate(R.layout.textviewonly,NULL);            持有人=新viewHolder();
            holder.top =(TextView中)convertView.findViewById(R.id.toptext);
            holder.bottom =(TextView中)convertView.findViewById(R.id.bottomtext);
            holder.downside =(TextView中)convertView.findViewById(R.id.lowest);
            holder.base =(TextView中)convertView.findViewById(R.id.baseid);
            convertView.setTag(保持器);
        }其他{
            支架=(viewHolder)convertView.getTag();
        }
        holder.top.setText(名字[位置]);
        holder.bottom.setText(类型[位置]);
        holder.downside.setText(编号[位置]);
        holder.base.setText(IDS [位置]);
        返回convertView;
    }    公共过滤用getFilter(){
        // TODO自动生成方法存根
        如果(MFILTER == NULL){
            MFILTER =新ArrayFilter();
        }
        返回MFILTER;
    }    私有类ArrayFilter扩展过滤器{        @覆盖
        保护FilterResults performFiltering(CharSequence的preFIX){
            FilterResults结果=新FilterResults();            如果(mOriginalValues​​ == NULL){
                同步(MLOCK){
                    // mOriginalValues​​ =新的ArrayList<串GT;(mObjects);                    mOriginalValues​​ =新的ArrayList<字符串> (名单)
                }
            }            如果(preFIX == NULL || prefix.length()== 0){
                同步(MLOCK){
                    ArrayList的<字符串>名单=新的ArrayList<字符串> (mOriginalValues​​);
                    results.values​​ =清单;
                    results.count =则为list.size();
                }
            }其他{
                。字符串prefixString = prefix.toString()与toLowerCase();                最终的ArrayList<字符串>值= mOriginalValues​​;
                最终诠释计数= values​​.size();                最终的ArrayList<字符串> newValues​​ =新的ArrayList<字符串> (计数);                的for(int i = 0; I<计数;我++){
                    最终的字符串值= values​​.get(I)
                    最后弦乐valueText = value.toString()与toLowerCase()。                    //反对整个首场比赛,非分裂值
                    如果(valueText.startsWith(prefixString)){
                        newValues​​.add(值);
                    }其他{
                        最终的String []字= valueText.split();
                        最终诠释=的wordCount words.length;                        对于(INT K = 0; K<的wordCount; k ++){
                            如果(字[K] .startsWith(prefixString)){
                                newValues​​.add(值);
                                打破;
                            }
                        }
                    }
                }                results.values​​ = newValues​​;
                results.count = newValues​​.size();
            }            返回结果;
        }        @覆盖
        保护无效publishResults(CharSequence的约束,FilterResults结果){
            // noinspection选中
            mObjects =(列表<串GT;)results.values​​;
            如果(results.count大于0){
                notifyDataSetChanged();
            }其他{
                notifyDataSetInvalidated();
            }
        }
    }
}


解决方案

在此code:

  et.addTextChangedListener(新TextWatcher(){    公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){// TODO自动生成方法存根
        。lva.getFilter()过滤器(S);        lva.notifyDataSetInvalidated();
        lva.notifyDataSetChanged();
        lv.setAdapter(LVA);
    }    公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数,
        INT后){      // TODO自动生成方法存根    }    公共无效afterTextChanged(编辑S){        // TODO自动生成方法存根
    }
});

ontextChanged()方法只使用:

  lva.getFilter()过滤器(S);

I have been searching a lot about searching items in list view through edit text,and though I found many questions similar to my problem ,but everywhere either cursor adapter is used where filtered result is fetched directly from database or some array list is used.

In my case I have been using couple of arrays to pass text for my list view using base adapter.as I have never done something like this before,I am unable to understand the use of text watcher .

I debugged the code and found that that publish results method is not getting called up, may be that is why list view is unable to get the new values. Do I have to call listviewadaptercontacts class again with the refreshed values in names array inside on text changed method.

Please help.

public class AllContactsActivity extends ListActivity implements
android.view.View.OnClickListener, OnItemClickListener {

    ListView lv;
    ListViewAdapterContacts lva;
    String[] names, phones, ids, types;


    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        LayoutParams params = new RelativeLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        LinearLayout mainLayout = new LinearLayout(this);
        mainLayout.setOrientation(LinearLayout.VERTICAL);
        LayoutInflater layoutInflater = getLayoutInflater();
        mainLayout.addView(layoutInflater.inflate(R.layout.allcontacts, null));
        mainLayout.addView(layoutInflater.inflate(R.layout.allbuttons, null));
        this.addContentView(mainLayout, params);

        configureBottomMenu();
        getContacts();

        lv = new ListView(getApplicationContext());
        lv = (ListView) findViewById(android.R.id.list);
        lva = new ListViewAdapterContacts(this, names, types, phones, ids); //passing arrays to class
        lv.setAdapter(lva);
        et = (EditText) findViewById(R.id.searchcontact);
        et.addTextChangedListener(new TextWatcher() {

            public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub
                lva.getFilter().filter(s);

                lva.notifyDataSetInvalidated();
                lva.notifyDataSetChanged();
                lv.setAdapter(lva);
            }

            public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {

                // TODO Auto-generated method stub

            }

            public void afterTextChanged(Editable s) {
                // TODO Auto-generated   method stub
            }
        });

        //some code
    }
}


public class ListViewAdapterContacts extends BaseAdapter implements Filterable {

    private ArrayFilter mFilter;
    private ArrayList < String > mOriginalValues;
    private final Object mLock = new Object();
    private List < String > mObjects;
    List list;

    Activity context;
    String[] names;
    String[] types;
    String[] numbers;
    String[] ids;
    public ListViewAdapterContacts(Activity context, String[] names, String[] types, String[] numbers, String[] ids) {
        // TODO Auto-generated constructor stub

        this.context = context;
        this.names = names;
        this.types = types;
        this.numbers = numbers;
        this.ids = ids;
        Object[] array = names;
        list = Arrays.asList(array);
    }



    public int getCount() {
        // TODO Auto-generated method stub 
        if (names == null) {
            return 0;
        } else {
            return names.length;
        }
    }

    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    public class viewHolder {
        TextView top;
        TextView bottom;
        TextView downside;
        TextView base;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        viewHolder holder;
        if (convertView == null) {

            LayoutInflater inflator = context.getLayoutInflater();
            convertView = inflator.inflate(R.layout.textviewonly, null);

            holder = new viewHolder();
            holder.top = (TextView) convertView.findViewById(R.id.toptext);
            holder.bottom = (TextView) convertView.findViewById(R.id.bottomtext);
            holder.downside = (TextView) convertView.findViewById(R.id.lowest);
            holder.base = (TextView) convertView.findViewById(R.id.baseid);
            convertView.setTag(holder);
        } else {
            holder = (viewHolder) convertView.getTag();
        }
        holder.top.setText(names[position]);
        holder.bottom.setText(types[position]);
        holder.downside.setText(numbers[position]);
        holder.base.setText(ids[position]);
        return convertView;
    }

    public Filter getFilter() {
        // TODO Auto-generated method stub
        if (mFilter == null) {
            mFilter = new ArrayFilter();
        }
        return mFilter;
    }

    private class ArrayFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence prefix) {
            FilterResults results = new FilterResults();

            if (mOriginalValues == null) {
                synchronized(mLock) {
                    //mOriginalValues = new ArrayList<String>(mObjects);

                    mOriginalValues = new ArrayList < String > (list);
                }
            }

            if (prefix == null || prefix.length() == 0) {
                synchronized(mLock) {
                    ArrayList < String > list = new ArrayList < String > (mOriginalValues);
                    results.values = list;
                    results.count = list.size();
                }
            } else {
                String prefixString = prefix.toString().toLowerCase();

                final ArrayList < String > values = mOriginalValues;
                final int count = values.size();

                final ArrayList < String > newValues = new ArrayList < String > (count);

                for (int i = 0; i < count; i++) {
                    final String value = values.get(i);
                    final String valueText = value.toString().toLowerCase();

                    // First match against the whole, non-splitted value
                    if (valueText.startsWith(prefixString)) {
                        newValues.add(value);
                    } else {
                        final String[] words = valueText.split(" ");
                        final int wordCount = words.length;

                        for (int k = 0; k < wordCount; k++) {
                            if (words[k].startsWith(prefixString)) {
                                newValues.add(value);
                                break;
                            }
                        }
                    }
                }

                results.values = newValues;
                results.count = newValues.size();
            }

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            //noinspection unchecked
            mObjects = (List < String > ) results.values;
            if (results.count > 0) {
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }
    }
}

解决方案

In this code:

et.addTextChangedListener(new TextWatcher() {

    public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub
        lva.getFilter().filter(s);

        lva.notifyDataSetInvalidated();
        lva.notifyDataSetChanged();
        lv.setAdapter(lva);
    }

    public void beforeTextChanged(CharSequence s, int start, int count,
        int after) { 

      // TODO Auto-generated method stub

    }

    public void afterTextChanged(Editable s) {

        // TODO Auto-generated  method stub      
    }
});

In ontextChanged() method only use:

lva.getFilter().filter(s);

这篇关于如何同时使用Android的基本适配器来过滤列表项?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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