I have a ListFragment which populates lists with checkbox. Whenever i click on few checkbox some other checkbox is also getting selected automatically on same list.
public class ListViewDemoAdapter extends ArrayAdapter<ListViewItem> {
public ListViewDemoAdapter(Context context, List<ListViewItem> items) {
super(context, R.layout.mytrip_item, items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if(convertView == null) {
// inflate the GridView item layout
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.mytrip_item, parent, false);
// initialize the view holder
viewHolder = new ViewHolder();
viewHolder.ivIcon = (ImageView) convertView.findViewById(R.id.ivIcon);
viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
viewHolder.tvDescription = (TextView) convertView.findViewById(R.id.tvDescription);
viewHolder.ratingBar = (RatingBar) convertView.findViewById(R.id.ratingBar);
// update the item view
ListViewItem item = getItem(position);
Glide.with(getContext())
.load(NetworkIp.IMAGE_URL+item.pic_url)
.into(viewHolder.ivIcon);
viewHolder.tvTitle.setText(item.placename);
viewHolder.tvDescription.setText(item.placedesc);
viewHolder.ratingBar.setRating(item.placerate);
return convertView;}
private static class ViewHolder {
ImageView ivIcon;
TextView tvTitle;
TextView tvDescription;
TextView tvDateTime;
CheckBox chkBox;
RatingBar ratingBar;
}
}
You have to maintain a seperate hashMap for your check boxes to see whether they are selected or not because list view recycles its views.You can do like this:-
public class ListViewDemoAdapter extends ArrayAdapter<ListViewItem> {
public HashMap<Integer,Boolean> chk;
public ListViewDemoAdapter(Context context, List<ListViewItem> items) {
super(context, R.layout.mytrip_item, items);
chk = new HashMap<>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if(convertView == null) {
// inflate the GridView item layout
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.mytrip_item, parent, false);
// initialize the view holder
viewHolder = new ViewHolder();
viewHolder.ivIcon = (ImageView) convertView.findViewById(R.id.ivIcon);
viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
viewHolder.tvDescription = (TextView) convertView.findViewById(R.id.tvDescription);
viewHolder.ratingBar = (RatingBar) convertView.findViewById(R.id.ratingBar);
viewHolder.chkBox = (CheckBox) convertView.findViewById(R.id.chk); /// Your checkbox ID
convertView.setTag(viewHolder); // setTag
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// update the item view
ListViewItem item = getItem(position);
Glide.with(getContext())
.load(NetworkIp.IMAGE_URL+item.pic_url)
.into(viewHolder.ivIcon);
viewHolder.tvTitle.setText(item.placename);
viewHolder.tvDescription.setText(item.placedesc);
viewHolder.ratingBar.setRating(item.placerate);
viewHolder.chkBox.setTag(position);
if(chk.containsKey(position)) {
viewHolder.chkBox.setChecked(chk.get(position));
}else{
viewHolder.chkBox.setChecked(false);
chk.put(position, false);
}
viewHolder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
chk.put((Integer) buttonView.getTag(), isChecked);
}
});
return convertView;
}
private static class ViewHolder {
ImageView ivIcon;
TextView tvTitle;
TextView tvDescription;
TextView tvDateTime;
CheckBox chkBox;
RatingBar ratingBar;
}
}