Android ListView Filter changes the state of the list item
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.
Android ListView Filter changes the state of the list item
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.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK