8

Android ListView Filter changes the state of the list item

 2 years ago
source link: https://www.codesd.com/item/android-listview-filter-changes-the-state-of-the-list-item.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Android ListView Filter changes the state of the list item

advertisements

I have created a listview and each row has a checkbox. Initially some check boxes are checked and some are not. On top the listview there is a Edittext, when I enter values in edittext list shows only filtered values. By the way I have implemeted Filterable interface. Problem I am facing is I am getting filtered result after entering some value in edit text with checkbox state is unevenly changed. I mean Checked check box for a row is showing as unchecked after filtering and vice-versa.

My ListView Adapter code is as follows

    public class AllUsersListAdapter implements ListAdapter, Filterable {

        public List<HEADER> allUsers;
        public List<HEADER>filteredUsers;
        Context context;
        int layoutResourceId;
        private Filter mFilter;
        private DataSetObservable mDataSetObservable = new DataSetObservable();

        public AllUsersListAdapter(Context context, int resource, List<HEADER> allUsers) {
            this.filteredUsers = this.allUsers =  allUsers;
            this.context = context;
            layoutResourceId = resource;
        }

        @Override
        public void registerDataSetObserver(DataSetObserver observer) {
            mDataSetObservable.registerObserver(observer);
        }

        @Override
        public void unregisterDataSetObserver(DataSetObserver observer) {
            mDataSetObservable.unregisterObserver(observer);
        }

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

        @Override
        public HEADER getItem(int position) {
            return filteredUsers.get(position);
        }

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

        @Override
        public boolean hasStableIds() {
            return false;
        }

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

            if (row == null) {
                LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                row = inflater.inflate(layoutResourceId, parent, false);

                holder = new ViewHolder();
                holder.userName = (TextView) row.findViewById(R.id.userName);
                holder.desc = (TextView) row.findViewById(R.id.userDesc);
                    holder.rowCheckBox = (CheckBox) row.findViewById(R.id.rowCheckBox);
                    holder.rowCheckBox.setVisibility(View.VISIBLE);
                HEADER header = getItem(position);
                if(CreateGroupHelperClass.selectedUsers.contains(header))
                {
                    holder.rowCheckBox.setChecked(true);
                }
                    final ViewHolder finalHolder = holder;
                holder.rowCheckBox.setTag(allUsers.get(position));
                    holder.rowCheckBox
                            .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                                @Override
                                public void onCheckedChanged(CompoundButton buttonView,
                                                             boolean isChecked) {
                                    HEADER element = (HEADER) finalHolder.rowCheckBox
                                            .getTag();
                                    if (isChecked) {
                                       CreateGroupHelperClass.unSelectedUsers.remove(element);
                                        CreateGroupHelperClass.selectedUsers.add(element);
                                    }
                                    else {
                                        CreateGroupHelperClass.selectedUsers.remove(element);
                                        CreateGroupHelperClass.unSelectedUsers.add(element);
                                    }
                                }
                            });;
                row.setTag(holder);
            } else {
                holder = (ViewHolder) row.getTag();
            }
            HEADER header = getItem(position);
            holder.userName.setText(header.getNAME());
            holder.desc.setText(header.getFRONTEND_ID());
            return row;
        }

        @Override
        public int getItemViewType(int position) {
            return 0;
        }

        @Override
        public int getViewTypeCount() {
            return 1;
        }

        @Override
        public boolean isEmpty() {
            return false;
        }

        @Override
        public boolean areAllItemsEnabled() {
            return true;
        }

        @Override
        public boolean isEnabled(int position) {
            return true;
        }

        @Override
        public Filter getFilter() {
            if (mFilter == null) {
                mFilter = new ContactFilter();
            }
            return mFilter;
        }

        private class ContactFilter extends Filter {

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults filterResults = new FilterResults();
                if (constraint == null || constraint.length() == 0) {
                    filterResults.values = allUsers;
                    filterResults.count = allUsers.size();
                } else {
                    final String lastToken = constraint.toString().toLowerCase();
                    final int count = allUsers.size();
                    final List<HEADER> list = new ArrayList<HEADER>();
                    HEADER header;

                    for (int i = 0; i < count; i++) {
                        header = allUsers.get(i);
                        if (header.getNAME().toLowerCase().startsWith(lastToken)) {
                            list.add(header);
                        }
                    }

                    filterResults.values = list;
                    filterResults.count = list.size();
                }
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                filteredUsers = (List<HEADER>)results.values;
                if (results.count > 0) {
                    notifyDataSetChanged();
                } else {
                    notifyDataSetInvalidated();
                }
            }
        }

        public void clearSelectedUsersList() {
            if (allUsers != null) allUsers.clear();
        }

        public void notifyDataSetChanged() {
            mDataSetObservable.notifyChanged();
        }

        public void notifyDataSetInvalidated() {
            mDataSetObservable.notifyInvalidated();
        }

        static class ViewHolder {
            TextView userName;
            TextView desc;
            ImageButton cancel_image_button;
            CheckBox rowCheckBox;
        }
}


I found solution for my problem. Following change actually solves the problem.

 holder.rowCheckBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CheckBox cb = (CheckBox)v;
                HEADER element = (HEADER) cb.getTag();
                if (cb.isChecked()) {
                            CreateGroupHelperClass.unSelectedUsers.remove(element);
                            CreateGroupHelperClass.selectedUsers.add(element);
                        }
                        else {
                            CreateGroupHelperClass.selectedUsers.remove(element);
                            CreateGroupHelperClass.unSelectedUsers.add(element);
                        }
            }
        });

Instead of OnCheckedChangeListener() I used View.OnClickListener() and that solved my problem.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK