安卓:当用getFilter()呼吁改变选中复选框中的ListView值 [英] Android : Change CheckBox checked value in ListView when getFilter() called

查看:572
本文介绍了安卓:当用getFilter()呼吁改变选中复选框中的ListView值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近我的问题了 MultiSpinner 价值选择从微调对话框多个值。我曾与下面的类做成功。

MultiSpinnerSearch.java

 包com.example.multiplechoicelistwithfilter;进口的java.util.List;进口android.app.AlertDialog;
进口android.content.Context;
进口android.content.DialogInterface;
进口android.content.DialogInterface.OnCancelListener;
进口android.text.Editable;
进口android.text.TextWatcher;
进口android.util.AttributeSet;
进口android.util.SparseBooleanArray;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.widget.ArrayAdapter;
进口android.widget.EditText;
进口android.widget.ListView;
进口android.widget.Spinner;公共类MultiSpinnerSearch扩展微调实现OnCancelListener {    私人列表<&你好GT;项目;
    []选择//私人布尔;
    私人字符串defaultText;
    私人MultiSpinnerListener侦听器;    公共MultiSpinnerSearch(上下文的背景下){
        超级(上下文);
    }    公共MultiSpinnerSearch(上下文为arg0,ARG1的AttributeSet){
        超(为arg0,ARG1);
    }    公共MultiSpinnerSearch(上下文为arg0,ARG1的AttributeSet,诠释ARG2){
        超(为arg0,ARG1,ARG2);
    }    @覆盖
    公共无效onCancel(DialogInterface对话){
        //刷新微调文本        StringBuffer的spinnerBuffer =新的StringBuffer();        的for(int i = 0; I< items.size();我++){
            如果(items.get(I).isSelected()==真){
                spinnerBuffer.append(items.get(ⅰ).getName());
                spinnerBuffer.append(,);
            }
        }        串spinnerText =;
        spinnerText = spinnerBuffer.toString();
        如果(spinnerText.length()→2)
            spinnerText = spinnerText.substring(0,spinnerText.length() - 2);
        其他
            spinnerText = defaultText;        ArrayAdapter<串GT;适配器=新ArrayAdapter<串GT;(的getContext()
                android.R.layout.simple_dropdown_item_1line,
                新的String [] {spinnerText});
        setAdapter(适配器);        listener.onItemsSelected(项目);
    }
    @覆盖
    公共布尔performClick(){        AlertDialog.Builder建设者=新AlertDialog.Builder(的getContext());
        builder.setTitle(defaultText);        LayoutInflater吹气=(LayoutInflater)的getContext()getSystemService(Context.LAYOUT_INFLATER_SERVICE)。        查看查看= inflater.inflate(R.layout.alert_dialog_listview_search,NULL);
        builder.setView(视图);        最终的ListView的ListView =(ListView控件)view.findViewById(R.id.alertSearchListView);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        最后MyAdapter适配器=新MyAdapter(的getContext(),项目);
        listView.setAdapter(适配器);        EDITTEXT的EditText =(EditText上)view.findViewById(R.id.alertSearchEditText);
        editText.addTextChangedListener(新TextWatcher(){            @覆盖
            公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){                。adapter.getFilter()过滤(s.toString());
            }            @覆盖
            公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数后INT){
            }            @覆盖
            公共无效afterTextChanged(编辑S){
            }
        });        //builder.setMultiChoiceItems(items.toArray(new的CharSequence [items.size()]),选择,这一点);
        builder.setPositiveButton(android.R.string.ok,
                新DialogInterface.OnClickListener(){            @覆盖
            公共无效的onClick(DialogInterface对话,诠释它){                SparseBooleanArray SP = listView.getCheckedItemPositions();                的for(int i = 0; I< items.size();我++){
                    items.get(ⅰ).setSelected(sp.get(ⅰ));
                }
                dialog.cancel();
            }
        });        builder.setOnCancelListener(本);
        builder.show();
        返回true;
    }    公共无效setItems(列表<&你好GT;的项目,字符串allText,INT位置,
            MultiSpinnerListener监听){        this.items =物品;
        this.defaultText = allText;
        this.listener =侦听器;        //所有默认选择
        //选择=新的布尔[items.size()];
        //的for(int i = 0; I< selected.length;我++)
        //选择[I] = FALSE;        如果(位置!= -1)
        {
            items.get(位置).setSelected(真);
            listener.onItemsSelected(项目);            onCancel(NULL);
        }    }    公共接口MultiSpinnerListener {
        公共无效onItemsSelected(列表<&你好GT;项目);
    }
}

MyAdapter类:

 包com.example.multiplechoicelistwithfilter;进口的java.util.ArrayList;
进口的java.util.List;进口android.annotation.Sup pressLint;
进口android.content.Context;
进口android.util.Log;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.BaseAdapter;
进口android.widget.CheckedTextView;
进口android.widget.Filter;
进口android.widget.Filterable;公共类MyAdapter扩展BaseAdapter实现过滤的{        清单<&你好GT; ArrayList的;
        清单<&你好GT; mOriginalValues​​; //原始值
        LayoutInflater吹气;        公共MyAdapter(上下文的背景下,列表与LT;你好>的ArrayList){
            this.arrayList = ArrayList的;
            充气= LayoutInflater.from(上下文);
        }        @覆盖
        公众诠释的getCount(){
            返回arrayList.size();
        }        @覆盖
        公共对象的getItem(INT位置){
            返回的位置;
        }        @覆盖
        众长getItemId(INT位置){
            返回的位置;
        }        私有类ViewHolder {
            CheckedTextView TextView的;
        }        @覆盖
        公共查看getView(INT位置,查看convertView,父母的ViewGroup){            ViewHolder支架=无效;            如果(convertView == NULL){                持有人=新ViewHolder();
                convertView = inflater.inflate(android.R.layout.select_dialog_multichoice,NULL);
                holder.textView =(CheckedTextView)convertView;                convertView.setTag(保持器);
            }其他{
                支架=(ViewHolder)convertView.getTag();
            }
            holder.textView.setText(arrayList.get(位置).getName());
            holder.textView.setChecked(arrayList.get(位置).isSelected());
            返回convertView;
        }        @燮pressLint(DefaultLocale)
        @覆盖
        公共过滤用getFilter(){
            过滤器过滤器=新的过滤器(){                @燮pressWarnings(未登记)
                @覆盖
                保护无效publishResults(CharSequence的约束,FilterResults结果){                    ArrayList的=(列表<&你好GT;)results.values​​; //有过滤后的值
                    notifyDataSetChanged(); //通知用新的过滤值的数据
                }                @覆盖
                保护FilterResults performFiltering(CharSequence的约束){
                    FilterResults结果=新FilterResults(); //保存过滤操作中值结果
                    清单<&你好GT; FilteredArrList =新的ArrayList<&你好GT;();                    如果(mOriginalValues​​ == NULL){
                        mOriginalValues​​ =新的ArrayList<&你好GT;(ArrayList的); //保存在mOriginalValues​​原始数据
                    }                    / ********
                     *
                     *如果约束(即收到的CharSequence)为null返回mOriginalValues​​(原件)值
                     *人这样做的过滤和返回FilteredArrList(过滤)
                     *
                     ******** /
                    如果(约束== NULL || constraint.length()== 0){                        //设置原始结果返回
                        results.count = mOriginalValues​​.size();
                        results.values​​ = mOriginalValues​​;
                    }其他{
                        约束= constraint.toString()与toLowerCase()。
                        的for(int i = 0; I< mOriginalValues​​.size();我++){
                            Log.i(TAG,+ mOriginalValues​​.get(ⅰ).getName()+ - >中+ mOriginalValues​​.get(ⅰ).isSelected());
                            字符串数据= mOriginalValues​​.get(I).getName();
                            如果(data.toLowerCase()。含有(constraint.toString())){
                                FilteredArrList.add(mOriginalValues​​.get(I));
                            }
                        }
                        //设置过滤的结果返回
                        results.count = FilteredArrList.size();
                        results.values​​ = FilteredArrList;
                    }
                    返回结果;
                }
            };
            返回过滤器;
        }
    }


  

我成功地得到输出如下,但在第一张图像猜想
  我是首先选择两个图像,然后过滤词球它给了我
  过滤的结果是选为前的复选框。



  

您可以看到,前两个项目之前没有选择,但它显示了
  同时过滤选择。


我坚持自去年几个小时这个愚蠢的问题。帮帮我吧。

您的帮助将是AP preciated。谢谢你。


解决方案

我已经创建了自己的lib和上载的Git:

也许它会帮助你所有的:

MultiSelectSpinner 是允许选择微调和多个项目搜索/过滤器从微调项目项目。

 公共类MultiSpinnerSearch扩展微调实现OnCancelListener {    私人列表< KeyPairBoolData>项目;
    []选择//私人布尔;
    私人字符串defaultText;
    私人MultiSpinnerSearchListener侦听器;
    MyAdapter适配器;    公共MultiSpinnerSearch(上下文的背景下){
        超级(上下文);
    }    公共MultiSpinnerSearch(上下文为arg0,ARG1的AttributeSet){
        超(为arg0,ARG1);
    }    公共MultiSpinnerSearch(上下文为arg0,ARG1的AttributeSet,诠释ARG2){
        超(为arg0,ARG1,ARG2);
    }    @覆盖
    公共无效onCancel(DialogInterface对话){
        //刷新微调文本        StringBuffer的spinnerBuffer =新的StringBuffer();        的for(int i = 0; I< items.size();我++){
            如果(items.get(I).isSelected()==真){
                spinnerBuffer.append(items.get(ⅰ).getName());
                spinnerBuffer.append(,);
            }
        }        串spinnerText =;
        spinnerText = spinnerBuffer.toString();
        如果(spinnerText.length()→2)
            spinnerText = spinnerText.substring(0,spinnerText.length() - 2);
        其他
            spinnerText = defaultText;        ArrayAdapter<串GT; adapterSpinner =新ArrayAdapter<串GT;(的getContext()
                R.layout.textview_for_spinner,
                新的String [] {spinnerText});
        setAdapter(adapterSpinner);        如果(适配器!= NULL)
            adapter.notifyDataSetChanged();        listener.onItemsSelected(项目);
    }    @覆盖
    公共布尔performClick(){        AlertDialog.Builder建设者=新AlertDialog.Builder(的getContext());
        builder.setTitle(defaultText);        LayoutInflater吹气=(LayoutInflater)的getContext()getSystemService(Context.LAYOUT_INFLATER_SERVICE)。        查看查看= inflater.inflate(R.layout.alert_dialog_listview_search,NULL);
        builder.setView(视图);        最终的ListView的ListView =(ListView控件)view.findViewById(R.id.alertSearchListView);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        listView.setFastScrollEnabled(假);
        适配器=新MyAdapter(的getContext(),项目);
        listView.setAdapter(适配器);        EDITTEXT的EditText =(EditText上)view.findViewById(R.id.alertSearchEditText);
        editText.addTextChangedListener(新TextWatcher(){            @覆盖
            公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){
                。adapter.getFilter()过滤(s.toString());
            }            @覆盖
            公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数后INT){
            }            @覆盖
            公共无效afterTextChanged(编辑S){
            }
        });        //builder.setMultiChoiceItems(items.toArray(new的CharSequence [items.size()]),选择,这一点);
        builder.setPositiveButton(android.R.string.ok,
                新DialogInterface.OnClickListener(){            @覆盖
            公共无效的onClick(DialogInterface对话,诠释它){//项目=(ArrayList的< KeyPairBoolData>)adapter.arrayList;                Log.i(TAG,的相关文件:+ items.size());
                dialog.cancel();
            }
        });        builder.setOnCancelListener(本);
        builder.show();
        返回true;
    }    公共无效setItems(列表< KeyPairBoolData>的项目,字符串allText,INT位置,
            MultiSpinnerSearchListener监听){        this.items =物品;
        this.defaultText = allText;
        this.listener =侦听器;        ArrayAdapter<串GT; adapterSpinner =新ArrayAdapter<串GT;(的getContext()
                R.layout.textview_for_spinner,
                新的String [] {defaultText});
        setAdapter(adapterSpinner);        如果(位置!= -1)
        {
            items.get(位置).setSelected(真);
            //listener.onItemsSelected(items);
            onCancel(NULL);
        }
    }    公共接口MultiSpinnerSearchListener {
        公共无效onItemsSelected(列表< KeyPairBoolData>项目);
    }    // //适配器类别
    公共类MyAdapter扩展BaseAdapter实现过滤的{        清单< KeyPairBoolData> ArrayList的;
        清单< KeyPairBoolData> mOriginalValues​​; //原始值
        LayoutInflater吹气;        公共MyAdapter(上下文的背景下,列表与LT; KeyPairBoolData>的ArrayList){
            this.arrayList = ArrayList的;
            充气= LayoutInflater.from(上下文);
        }        @覆盖
        公众诠释的getCount(){
            返回arrayList.size();
        }        @覆盖
        公共对象的getItem(INT位置){
            返回的位置;
        }        @覆盖
        众长getItemId(INT位置){
            返回的位置;
        }        私有类ViewHolder {
            TextView中的TextView;
            复选框复选框;
        }        @覆盖
        公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup){            ViewHolder支架=无效;            如果(convertView == NULL){                持有人=新ViewHolder();
                convertView = inflater.inflate(R.layout.alert_dialog_listview_search_subview,NULL);
                holder.textView =(TextView中)convertView.findViewById(R.id.alertTextView);
                holder.checkBox =(复选框)convertView.findViewById(R.id.alertCheckbox);                convertView.setTag(保持器);
            }其他{
                支架=(ViewHolder)convertView.getTag();
            }            最后KeyPairBoolData数据= arrayList.get(位置);            holder.textView.setText(data.getName());
            holder.checkBox.setChecked(data.isSelected());            convertView.setOnClickListener(新View.OnClickListener()
            {
                公共无效的onClick(视图v)
                {
                    ViewHolder TEMP =(ViewHolder)v.getTag();
                    temp.checkBox.setChecked(temp.checkBox.isChecked()!);                    INT LEN = arrayList.size();
                    的for(int i = 0; I< LEN,我++)
                    {
                        如果(我==位置)
                        {
                            data.setSelected(data.isSelected()!);
                            Log.i(TAG,在单击选定:+ data.getName()+:+ data.isSelected());
                            打破;
                        }
                    }
                }
            });            holder.checkBox.setTag(保持器);            返回convertView;
        }        @燮pressLint(DefaultLocale)
        @覆盖
        公共过滤用getFilter(){
            过滤器过滤器=新的过滤器(){                @燮pressWarnings(未登记)
                @覆盖
                保护无效publishResults(CharSequence的约束,FilterResults结果){                    ArrayList的=(列表< KeyPairBoolData>)results.values​​; //有过滤后的值
                    notifyDataSetChanged(); //通知用新的过滤值的数据
                }                @覆盖
                保护FilterResults performFiltering(CharSequence的约束){
                    FilterResults结果=新FilterResults(); //保存过滤操作中值结果
                    清单< KeyPairBoolData> FilteredArrList =新的ArrayList< KeyPairBoolData>();                    如果(mOriginalValues​​ == NULL){
                        mOriginalValues​​ =新的ArrayList< KeyPairBoolData>(ArrayList的); //保存在mOriginalValues​​原始数据
                    }                    / ********
                     *
                     *如果约束(即收到的CharSequence)为null返回mOriginalValues​​(原件)值
                     *人这样做的过滤和返回FilteredArrList(过滤)
                     *
                     ******** /
                    如果(约束== NULL || constraint.length()== 0){                        //设置原始结果返回
                        results.count = mOriginalValues​​.size();
                        results.values​​ = mOriginalValues​​;
                    }其他{
                        约束= constraint.toString()与toLowerCase()。
                        的for(int i = 0; I< mOriginalValues​​.size();我++){
                            Log.i(TAG,过滤器:+ mOriginalValues​​.get(ⅰ).getName()+ - >中+ mOriginalValues​​.get(ⅰ).isSelected());
                            字符串数据= mOriginalValues​​.get(I).getName();
                            如果(data.toLowerCase()。含有(constraint.toString())){
                                FilteredArrList.add(mOriginalValues​​.get(I));
                            }
                        }
                        //设置过滤的结果返回
                        results.count = FilteredArrList.size();
                        results.values​​ = FilteredArrList;
                    }
                    返回结果;
                }
            };
            返回过滤器;
        }
    }
}

谢谢:)继续分享:)

I recently posted my Question for MultiSpinner values to choose Multiple values from Spinner dialog. I've done successfully with following class.

MultiSpinnerSearch.java

package com.example.multiplechoicelistwithfilter;

import java.util.List;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;

public class MultiSpinnerSearch extends Spinner implements OnCancelListener {

    private List<Hello> items;
    //private boolean[] selected;
    private String defaultText;
    private MultiSpinnerListener listener;

    public MultiSpinnerSearch(Context context) {
        super(context);
    }

    public MultiSpinnerSearch(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
    }

    public MultiSpinnerSearch(Context arg0, AttributeSet arg1, int arg2) {
        super(arg0, arg1, arg2);
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        // refresh text on spinner

        StringBuffer spinnerBuffer = new StringBuffer();

        for (int i = 0; i < items.size(); i++) {
            if (items.get(i).isSelected() == true) {
                spinnerBuffer.append(items.get(i).getName());
                spinnerBuffer.append(", ");
            }
        }

        String spinnerText = "";
        spinnerText = spinnerBuffer.toString();
        if (spinnerText.length() > 2)
            spinnerText = spinnerText.substring(0, spinnerText.length() - 2);
        else
            spinnerText = defaultText;

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(),
                android.R.layout.simple_dropdown_item_1line,
                new String[] { spinnerText });
        setAdapter(adapter);

        listener.onItemsSelected(items);
    }


    @Override
    public boolean performClick() {

        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
        builder.setTitle(defaultText);

        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE );

        View view = inflater.inflate(R.layout.alert_dialog_listview_search, null);
        builder.setView(view);

        final ListView listView = (ListView) view.findViewById(R.id.alertSearchListView);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        final MyAdapter adapter = new MyAdapter(getContext(), items);
        listView.setAdapter(adapter);

        EditText editText = (EditText) view.findViewById(R.id.alertSearchEditText);
        editText.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

                adapter.getFilter().filter(s.toString());
            }

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

            @Override
            public void afterTextChanged(Editable s) {  
            }
        });

        //builder.setMultiChoiceItems(items.toArray(new CharSequence[items.size()]), selected, this);
        builder.setPositiveButton(android.R.string.ok,
                new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                SparseBooleanArray sp = listView.getCheckedItemPositions();

                for(int i=0;i<items.size();i++) {
                    items.get(i).setSelected(sp.get(i));
                }               
                dialog.cancel();
            }
        });

        builder.setOnCancelListener(this);
        builder.show();
        return true;
    }

    public void setItems(List<Hello> items, String allText, int position,
            MultiSpinnerListener listener) {

        this.items = items;
        this.defaultText = allText;
        this.listener = listener;

        // all selected by default
        //selected = new boolean[items.size()];
        //for (int i = 0; i < selected.length; i++)
        //  selected[i] = false;    

        if(position != -1)
        {
            items.get(position).setSelected(true);
            listener.onItemsSelected(items);

            onCancel(null);
        }

    }

    public interface MultiSpinnerListener {
        public void onItemsSelected(List<Hello> items);
    } 
}

MyAdapter class:

package com.example.multiplechoicelistwithfilter;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckedTextView;
import android.widget.Filter;
import android.widget.Filterable;

public class MyAdapter extends BaseAdapter implements Filterable {

        List<Hello> arrayList;      
        List<Hello> mOriginalValues; // Original Values
        LayoutInflater inflater;

        public MyAdapter(Context context, List<Hello> arrayList) {
            this.arrayList = arrayList;
            inflater = LayoutInflater.from(context);
        }

        @Override
        public int getCount() {
            return arrayList.size();
        }

        @Override
        public Object getItem(int position) {
            return position;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        private class ViewHolder {
            CheckedTextView textView;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            ViewHolder holder = null;

            if (convertView == null) {

                holder = new ViewHolder();
                convertView = inflater.inflate(android.R.layout.select_dialog_multichoice, null);
                holder.textView = (CheckedTextView) convertView;

                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.textView.setText(arrayList.get(position).getName());
            holder.textView.setChecked(arrayList.get(position).isSelected());
            return convertView;
        }

        @SuppressLint("DefaultLocale")
        @Override
        public Filter getFilter() {
            Filter filter = new Filter() {

                @SuppressWarnings("unchecked")
                @Override
                protected void publishResults(CharSequence constraint,FilterResults results) {

                    arrayList = (List<Hello>) results.values; // has the filtered values
                    notifyDataSetChanged();  // notifies the data with new filtered values
                }

                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                    FilterResults results = new FilterResults();        // Holds the results of a filtering operation in values
                    List<Hello> FilteredArrList = new ArrayList<Hello>();

                    if (mOriginalValues == null) {
                        mOriginalValues = new ArrayList<Hello>(arrayList); // saves the original data in mOriginalValues
                    }

                    /********
                     * 
                     *  If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values
                     *  else does the Filtering and returns FilteredArrList(Filtered)  
                     *
                     ********/
                    if (constraint == null || constraint.length() == 0) {

                        // set the Original result to return  
                        results.count = mOriginalValues.size();
                        results.values = mOriginalValues;
                    } else {
                        constraint = constraint.toString().toLowerCase();
                        for (int i = 0; i < mOriginalValues.size(); i++) {
                            Log.i("TAG", "" + mOriginalValues.get(i).getName() + " -> " + mOriginalValues.get(i).isSelected());
                            String data = mOriginalValues.get(i).getName();
                            if (data.toLowerCase().contains(constraint.toString())) {
                                FilteredArrList.add(mOriginalValues.get(i));
                            }
                        }
                        // set the Filtered result to return
                        results.count = FilteredArrList.size();
                        results.values = FilteredArrList;
                    }
                    return results;
                }
            };
            return filter;
        }
    }

I am getting output successfully as below, but in first image suppose i am select first two image and then filtering word 'ball' it gives me filtered result with selected checkbox as before.

You can see that first two items not selected before but it shows selected while filtering.

I am stuck with this silly problem since last couple of hours. Help me.

Your help would be appreciated. Thanks.

解决方案

I have created my own lib and uploaded on Git:

May It will help you all:

MultiSelectSpinner is allows to Select Multiple Items from Spinner and SEARCH/ FILTER Item from Spinner Items.

public class MultiSpinnerSearch extends Spinner implements OnCancelListener {

    private List<KeyPairBoolData> items;
    //private boolean[] selected;
    private String defaultText;
    private MultiSpinnerSearchListener listener;
    MyAdapter adapter;

    public MultiSpinnerSearch(Context context) {
        super(context);
    }

    public MultiSpinnerSearch(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
    }

    public MultiSpinnerSearch(Context arg0, AttributeSet arg1, int arg2) {
        super(arg0, arg1, arg2);
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        // refresh text on spinner

        StringBuffer spinnerBuffer = new StringBuffer();

        for (int i = 0; i < items.size(); i++) {
            if (items.get(i).isSelected() == true) {
                spinnerBuffer.append(items.get(i).getName());
                spinnerBuffer.append(", ");
            }
        }

        String spinnerText = "";
        spinnerText = spinnerBuffer.toString();
        if (spinnerText.length() > 2)
            spinnerText = spinnerText.substring(0, spinnerText.length() - 2);
        else
            spinnerText = defaultText;

        ArrayAdapter<String> adapterSpinner = new ArrayAdapter<String>(getContext(),
                R.layout.textview_for_spinner,
                new String[] { spinnerText });
        setAdapter(adapterSpinner);

        if(adapter != null)
            adapter.notifyDataSetChanged();

        listener.onItemsSelected(items);
    }

    @Override
    public boolean performClick() {

        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
        builder.setTitle(defaultText);

        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE );

        View view = inflater.inflate(R.layout.alert_dialog_listview_search, null);
        builder.setView(view);

        final ListView listView = (ListView) view.findViewById(R.id.alertSearchListView);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        listView.setFastScrollEnabled(false);
        adapter = new MyAdapter(getContext(), items);
        listView.setAdapter(adapter);

        EditText editText = (EditText) view.findViewById(R.id.alertSearchEditText);
        editText.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                adapter.getFilter().filter(s.toString());
            }

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

            @Override
            public void afterTextChanged(Editable s) {  
            }
        });

        //builder.setMultiChoiceItems(items.toArray(new CharSequence[items.size()]), selected, this);
        builder.setPositiveButton(android.R.string.ok,
                new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

//              items = (ArrayList<KeyPairBoolData>) adapter.arrayList;

                Log.i("TAG", " ITEMS : " + items.size() );
                dialog.cancel();
            }
        });

        builder.setOnCancelListener(this);
        builder.show();
        return true;
    }

    public void setItems(List<KeyPairBoolData> items, String allText, int position,
            MultiSpinnerSearchListener listener) {

        this.items = items;
        this.defaultText = allText;
        this.listener = listener;

        ArrayAdapter<String> adapterSpinner = new ArrayAdapter<String>(getContext(),
                R.layout.textview_for_spinner,
                new String[] { defaultText });
        setAdapter(adapterSpinner);

        if(position != -1)
        {
            items.get(position).setSelected(true);
            //listener.onItemsSelected(items);
            onCancel(null);
        }
    }

    public interface MultiSpinnerSearchListener {
        public void onItemsSelected(List<KeyPairBoolData> items);
    }

    //  // Adapter Class            
    public class MyAdapter extends BaseAdapter implements Filterable {

        List<KeyPairBoolData> arrayList;      
        List<KeyPairBoolData> mOriginalValues; // Original Values
        LayoutInflater inflater;

        public MyAdapter(Context context, List<KeyPairBoolData> arrayList) {
            this.arrayList = arrayList;
            inflater = LayoutInflater.from(context);
        }

        @Override
        public int getCount() {
            return arrayList.size();
        }

        @Override
        public Object getItem(int position) {
            return position;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        private class ViewHolder {
            TextView textView;
            CheckBox checkBox;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

            ViewHolder holder = null;

            if (convertView == null) {

                holder = new ViewHolder();
                convertView = inflater.inflate(R.layout.alert_dialog_listview_search_subview, null);
                holder.textView = (TextView) convertView.findViewById(R.id.alertTextView);
                holder.checkBox = (CheckBox) convertView.findViewById(R.id.alertCheckbox);

                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            final KeyPairBoolData data = arrayList.get(position);

            holder.textView.setText(data.getName());
            holder.checkBox.setChecked(data.isSelected());

            convertView.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View v)
                {
                    ViewHolder temp = (ViewHolder) v.getTag();
                    temp.checkBox.setChecked(!temp.checkBox.isChecked());

                    int len = arrayList.size();
                    for (int i = 0; i < len; i++)
                    {
                        if (i == position)
                        {
                            data.setSelected(!data.isSelected());
                            Log.i("TAG", "On Click Selected : " + data.getName() + " : " + data.isSelected());
                            break;
                        }
                    }
                }
            });

            holder.checkBox.setTag(holder);

            return convertView;
        }

        @SuppressLint("DefaultLocale")
        @Override
        public Filter getFilter() {
            Filter filter = new Filter() {

                @SuppressWarnings("unchecked")
                @Override
                protected void publishResults(CharSequence constraint,FilterResults results) {

                    arrayList = (List<KeyPairBoolData>) results.values; // has the filtered values
                    notifyDataSetChanged();  // notifies the data with new filtered values
                }

                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                    FilterResults results = new FilterResults();        // Holds the results of a filtering operation in values
                    List<KeyPairBoolData> FilteredArrList = new ArrayList<KeyPairBoolData>();

                    if (mOriginalValues == null) {
                        mOriginalValues = new ArrayList<KeyPairBoolData>(arrayList); // saves the original data in mOriginalValues
                    }

                    /********
                     * 
                     *  If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values
                     *  else does the Filtering and returns FilteredArrList(Filtered)  
                     *
                     ********/
                    if (constraint == null || constraint.length() == 0) {

                        // set the Original result to return  
                        results.count = mOriginalValues.size();
                        results.values = mOriginalValues;
                    } else {
                        constraint = constraint.toString().toLowerCase();
                        for (int i = 0; i < mOriginalValues.size(); i++) {
                            Log.i("TAG", "Filter : " + mOriginalValues.get(i).getName() + " -> " + mOriginalValues.get(i).isSelected());
                            String data = mOriginalValues.get(i).getName();
                            if (data.toLowerCase().contains(constraint.toString())) {
                                FilteredArrList.add(mOriginalValues.get(i));
                            }
                        }
                        // set the Filtered result to return
                        results.count = FilteredArrList.size();
                        results.values = FilteredArrList;
                    }
                    return results;
                }
            };
            return filter;
        }
    }
}

Thanks :) Keep Sharing :)

这篇关于安卓:当用getFilter()呼吁改变选中复选框中的ListView值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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