ListFragment Checkbox 自动选中
ListFragment Checkbox is checked automatically
我有一个用复选框填充列表的 ListFragment。每当我点击几个复选框时,其他一些复选框也会在同一个列表中自动被选中。
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;
}
}
复选框属于回收视图!您必须在您的片段中保留一个单独的 "checked positions" 数组,并在您的 getView
方法中相应地更新您的复选框。
更新您的代码。在您的适配器中获取 CheckBox ID,并使用 setTag 和 getTag 实现 recycleView。
@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);
return convertView;
}
private static class ViewHolder {
ImageView ivIcon;
TextView tvTitle;
TextView tvDescription;
TextView tvDateTime;
CheckBox chkBox;
RatingBar ratingBar;
}
}
您必须为您的复选框维护一个单独的 hashMap 以查看它们是否被选中,因为 listview 回收它 views.You 可以这样做:-
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;
}
}
我有一个用复选框填充列表的 ListFragment。每当我点击几个复选框时,其他一些复选框也会在同一个列表中自动被选中。
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;
}
}
复选框属于回收视图!您必须在您的片段中保留一个单独的 "checked positions" 数组,并在您的 getView
方法中相应地更新您的复选框。
更新您的代码。在您的适配器中获取 CheckBox ID,并使用 setTag 和 getTag 实现 recycleView。
@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);
return convertView;
}
private static class ViewHolder {
ImageView ivIcon;
TextView tvTitle;
TextView tvDescription;
TextView tvDateTime;
CheckBox chkBox;
RatingBar ratingBar;
}
}
您必须为您的复选框维护一个单独的 hashMap 以查看它们是否被选中,因为 listview 回收它 views.You 可以这样做:-
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;
}
}