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;
    }
}