Android:在调用 getFilter() 时更改 ListView 中的 CheckBox 选中值 [英] Android : Change CheckBox checked value in ListView when getFilter() called

查看:28
本文介绍了Android:在调用 getFilter() 时更改 ListView 中的 CheckBox 选中值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近 允许从 Spinner 和 SEARCH/FILTER 中选择多个项目来自 Spinner Items 的项目.

public class MultiSpinnerSearch 扩展 Spinner 实现 OnCancelListener {私有列表项目;//私有布尔[]被选中;私人字符串 defaultText;私有 MultiSpinnerSearchListener 监听器;MyAdapter 适配器;公共 MultiSpinnerSearch(上下文上下文){超级(上下文);}公共 MultiSpinnerSearch(上下文 arg0,属性集 arg1){超级(arg0,arg1);}公共 MultiSpinnerSearch(上下文 arg0,属性集 arg1,int arg2){超级(arg0,arg1,arg2);}@覆盖public void onCancel(DialogInterface dialog) {//刷新微调器上的文本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();如果 (spinnerText.length() > 2)spinnerText = spinnerText.substring(0, spinnerText.length() - 2);别的spinnerText = defaultText;ArrayAdapteradapterSpinner = new ArrayAdapter(getContext(),R.layout.textview_for_spinner,new String[] { spinnerText });setAdapter(adapterSpinner);如果(适配器!= null)适配器.notifyDataSetChanged();listener.onItemsSelected(items);}@覆盖公共布尔 performClick() {AlertDialog.Builder builder = new AlertDialog.Builder(getContext());builder.setTitle(defaultText);LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);查看视图 = 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);适配器 = new MyAdapter(getContext(), items);listView.setAdapter(适配器);EditText editText = (EditText) view.findViewById(R.id.alertSearchEditText);editText.addTextChangedListener(new TextWatcher() {@覆盖public void onTextChanged(CharSequence s, int start, int before, int count) {adapter.getFilter().filter(s.toString());}@覆盖public void beforeTextChanged(CharSequence s, int start, int count, int after) {}@覆盖公共无效 afterTextChanged(可编辑的){}});//builder.setMultiChoiceItems(items.toArray(new CharSequence[items.size()]), selected, this);builder.setPositiveButton(android.R.string.ok,新 DialogInterface.OnClickListener() {@覆盖public void onClick(DialogInterface dialog, int which) {//items = (ArrayList)adapter.arrayList;Log.i("TAG", " 项目:" + items.size());对话框取消();}});builder.setOnCancelListener(this);builder.show();返回真;}public void setItems(List items, String allText, int position,MultiSpinnerSearchListener 监听器) {this.items = 物品;this.defaultText = allText;this.listener = 听众;ArrayAdapteradapterSpinner = new ArrayAdapter(getContext(),R.layout.textview_for_spinner,new String[] { defaultText });setAdapter(adapterSpinner);如果(位置!= -1){items.get(position).setSelected(true);//listener.onItemsSelected(items);取消(空);}}公共接口 MultiSpinnerSearchListener {public void onItemsSelected(List items);}////适配器类公共类 MyAdapter 扩展 BaseAdapter 实现 Filterable {列表数组列表;列表mOriginalValues;//原始值LayoutInflater 充气机;public MyAdapter(上下文上下文,列表 arrayList){this.arrayList = arrayList;充气器 = LayoutInflater.from(context);}@覆盖公共 int getCount() {返回 arrayList.size();}@覆盖公共对象 getItem(int position) {返回位置;}@覆盖public long getItemId(int position) {返回位置;}私有类 ViewHolder {文本视图文本视图;复选框复选框;}@覆盖public View getView(final int position, View convertView, ViewGroup parent) {ViewHolder 持有人 = null;if (convertView == null) {持有人 = 新的 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);} 别的 {持有人 = (ViewHolder) convertView.getTag();}最终 KeyPairBoolData 数据 = arrayList.get(position);holder.textView.setText(data.getName());holder.checkBox.setChecked(data.isSelected());convertView.setOnClickListener(new View.OnClickListener(){公共无效 onClick(查看 v){ViewHolder temp = (ViewHolder) v.getTag();temp.checkBox.setChecked(!temp.checkBox.isChecked());int len = arrayList.size();for (int i = 0; i ) results.values;//有过滤后的值notifyDataSetChanged();//用新的过滤值通知数据}@覆盖受保护的 FilterResults performFiltering(CharSequence 约束){FilterResults 结果 = new FilterResults();//将过滤操作的结果保存在值中列表FilteredArrList = new ArrayList();如果(mOriginalValues == null){mOriginalValues = new ArrayList(arrayList);//将原始数据保存在 mOriginalValues 中}/********** 如果约束(接收到的字符序列)为空,则返回 mOriginalValues(Original) 值* 否则进行过滤并返回 FilteredArrList(Filtered)*********/if (constraint == null || constraint.length() == 0) {//设置要返回的原始结果results.count = mOriginalValues.size();结果.values = mOriginalValues;} 别的 {约束 = 约束.toString().toLowerCase();for (int i = 0; i < mOriginalValues.size(); i++) {Log.i("TAG", "过滤器:" + mOriginalValues.get(i).getName() + " -> " + mOriginalValues.get(i).isSelected());字符串数据 = mOriginalValues.get(i).getName();如果 (data.toLowerCase().contains(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 :)

这篇关于Android:在调用 getFilter() 时更改 ListView 中的 CheckBox 选中值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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