【问题标题】:ListFragment Checkbox is checked automaticallyListFragment 复选框被自动选中
【发布时间】:2016-02-15 09:22:14
【问题描述】:

我有一个 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;
}

}

【问题讨论】:

标签: android android-listfragment checkboxlist


【解决方案1】:

您必须为您的复选框维护一个单独的 hashMap 以查看它们是否被选中,因为列表视图会回收其视图。您可以这样做:-

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

【讨论】:

  • 嘿,非常感谢@Frosty .. 它奏效了.. 非常感谢。还有一件事。如何获取所有选中的?
  • 只需遍历您的 chk hashMap 并查找已检查的。 'HashMap temp = new HashMap(chk); Iterator it = temp .entrySet().iterator(); while (it.hasNext()) { Map.Entry 对 = (Map.Entry)it.next(); if((Boolean)pair.getValue()){ //在这里你得到检查 } it.remove(); // 避免 ConcurrentModificationException }'
  • @Ravi 如果此解决方案对您有用,请接受并支持我的回答。
  • 我试图投票,但堆栈阻止了我,因为我是新手,我没有 15 个 repo。
【解决方案2】:

复选框属于回收视图!您必须在片段中保留一个单独的“已检查位置”数组,并在您的 getView 方法中相应地更新您的复选框。

【讨论】:

    【解决方案3】:

    更新您的代码。获取适配器中的 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;
       }
    }
    

    【讨论】:

    • 我在您的适配器中看不到此复选框设置。 viewHolder.chkBox = (CheckBox) convertView.findViewById(R.id.chk);请检查您的代码并定义
    猜你喜欢
    • 2014-07-28
    • 2017-06-07
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2018-03-11
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多