android - 在 listview 上过滤自定义适配器在 android 中无法正常工作?

标签 android listview filtering android-filterable

我有一个数组适配器,如下所示。并且我已经实现了一个 Filterable,但是当我输入 EditText 时也没有任何反应。

public class CustomAdapter extends ArrayAdapter<Custom> implements Filterable{
    private ArrayList<Custom> entries;
    private Activity activity;
    private Context context;
    private qrusers qrusers;
    CustomFilter customFilter;
    private String[] udis;
    ArrayList<String> userid= new ArrayList<String>();
    boolean[] checkBoxState;
    LayoutInflater vi;
    public CustomAdapter(Context context, ArrayList<Custom> entries,String []udis) {
        super(context,0,entries);
        this.entries = entries;
        this.context= context;
        this.udis=udis;
        checkBoxState=new boolean[entries.size()];
        this.qrusers =(qrusers) context;
        vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public static class ViewHolder{
        public TextView item1;
        public TextView item2;
        public CheckBox chek;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View v = convertView;
        ViewHolder holder;
        if (v == null) {

            v = vi.inflate(R.layout.checkboxlist, null);
            holder = new ViewHolder();
            holder.item1 = (TextView) v.findViewById(R.id.contactname);
            holder.item2 = (TextView) v.findViewById(R.id.companyname);
            holder.chek=(CheckBox)v.findViewById(R.id.checboxlist);



            v.setTag(holder);


        }

        else{
            holder=(ViewHolder)v.getTag();


        }
        holder.chek.setChecked(checkBoxState[position]);
        holder.chek.setTag(udis[position]);
        holder.chek.setOnClickListener(new OnClickListener() {
            private String s;
            @Override
            public void onClick(View v) {
                if (((CheckBox) v).isChecked()){
                    checkBoxState[position]=true;
                    //  isChecked=true;
                    s=(String)v.getTag();
                    Log.e("IDDDDDDDD", s);

                    userid.add(s);
            Log.e("ADDED ID", userid.toString());
            }
                else{
                    checkBoxState[position]=false;
                    s=(String)v.getTag();
                    userid.remove(s);
                    Log.e("Removed ID", userid.toString());
                }
                }

        }
        );
        final Custom custom = entries.get(position);
        if (custom != null) {
            holder.item1.setText(custom.getcustomBig());
            holder.item2.setText(custom.getcustomSmall());

        } 
        return v;
        }
    public Filter getFilter() {
        if (customFilter == null) {
            customFilter = new CustomFilter();
        }
        return customFilter;
    }


    public ArrayList<String> getUserid() {
        return userid;
    }
    public void setUserid(ArrayList<String> userid) {
        this.userid = userid;
    }
    private class CustomFilter extends Filter{

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            if(constraint == null || constraint.length() == 0) {
                results.values=entries;
                 results.count = entries.size();

            }
            else{

                ArrayList<Custom> newValues = new ArrayList<Custom>();
                for (Custom i : entries){

                     if (i.toString().toUpperCase().startsWith(constraint.toString().toUpperCase()))
                            newValues.add(i);
                 }
            }
            // TODO Auto-generated method stub
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
 if (results.count == 0){

                 notifyDataSetInvalidated();
             }
             else{

                 @SuppressWarnings("unchecked")
                ArrayList<Custom> lst = (ArrayList<Custom>)results.values;
                 ArrayList<Custom> itemsList = new ArrayList<Custom>(lst);
                 //this.items=mItems;
                entries =itemsList;              
                notifyDataSetChanged();
             }

        }


    }
}

在我的 Activity 中,我正在使用这段代码。

usersearch1.addTextChangedListener(new TextWatcher() {

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


                    s=usersearch1.getText().toString();
                    adapter.getFilter().filter(s);
                    Log.e("ALPHABETS", usersearch1.getText().toString());
                    //sendadapter.getFilter().filter(s);
                }

最佳答案

您的 publishResults() 方法应该如下所示:

@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
    if (results.count == 0){
        notifyDataSetInvalidated();
    } else {
        @SuppressWarnings("unchecked")
        ArrayList<Custom> lst = (ArrayList<Custom>)results.values;
        ArrayList<Custom> itemsList = new ArrayList<Custom>(lst);

        entries = itemsList;              
        clear();
        for (Custom item : entries) {
            add(item);
        }
    }
}

关于android - 在 listview 上过滤自定义适配器在 android 中无法正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21573853/

相关文章:

android - React Native Android,由于来自后台状态而同时运行的多个应用程序实例之前没有杀死应用程序

java - 向 ListView 行中的每个项目添加按钮时出现错误

android - 如何将 ListView 更改为 GridView on Button Click in android

sed - 使用 grep、awk 或 sed 过滤 nmap 输出

php - 根据子数组重复值删除数组项,然后按自定义顺序排序

android - 如何在 webview 中设置固定缩放级别或缩小?

android - 如何更改底部导航上的非 Activity 颜色?

android - 在 Android 的 BluetoothSocket inputstream.read() 中实现超时

android - ListView Activity OnItemClickListener TextView 的空指针异常

java - 如何从java中的字符串指定类属性