【问题标题】:How to get only updated checkbox status in listview android如何在listview android中仅获取更新的复选框状态
【发布时间】:2015-08-27 06:08:34
【问题描述】:

我在对话框中有一个带有复选框的列表视图。现在我只需要从对话框的“确定单击”中获取更新的复选框项目。例如,如果用户只选中行中的一个复选框,我只需要获得该状态,但如果用户选中并取消选中该复选框,我不想要该状态。我尝试在选中时使用哈希表来获取和删除状态,但是在列表视图滚动时,复选框事件被执行并且哈希表填充了错误的值。

public class SelectGroupAdaptor extends BaseAdapter {
    Activity activity;
    ArrayList<SelectGroupItems> data = new ArrayList<>();
Hashtable<Integer,Boolean> status;
    public SelectGroupAdaptor(Activity activity) {
        this.activity = activity;
    }

    public void add(SelectGroupItems selectGroupItems) {
        this.data.add(selectGroupItems);
        notifyDataSetChanged();
        status=new Hashtable<>();

    }

    public ArrayList<SelectGroupItems> getCheckedData () {
        return data;
    }
    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        TextView textView;
        CheckBox checkBox;
        if (convertView == null) {
            convertView = LayoutInflater.from(activity).inflate(R.layout.layout_select_group_row, null);

        }
        textView = (TextView) convertView.findViewById(R.id.label);
        textView.setTypeface(Util.setCustomFont(activity));
        checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
        textView.setText(data.get(position).getGroupName());
        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                                         boolean isChecked) {
                    data.get(position).setChecked(isChecked);
                if(status!=null)
                {
                    if(status.get(position)!=null)
                    {
                        status.remove(position);
                    }else
                    {
                        status.put(position,isChecked);
                    }
                }
            }
        });
        checkBox.setChecked((data.get(position).isChecked()));

        return convertView;
    }
    public  Hashtable<Integer,Boolean> getStatus()
    {
        return status;
    }
}

谁能帮帮我

【问题讨论】:

  • 那么位置值是多少?而且您已经有一个存储项目检查状态的数据列表,我认为状态哈希表并不是真正需要的。如果需要知道检查的是什么,可以循环数据列表来查找。
  • 请使用标点符号改进您的问题。你的问题很难读。
  • 我已经更新了我的代码
  • 您的代码中存在一些问题。您没有使用持有人。所以它会在滚动 listView 时发生变化。
  • 当我调用 getStatus() 哈希表时,我需要这样的输出,其中包含项目的位置和复选框的布尔状态,仅修改过

标签: java android listview


【解决方案1】:

您不需要 HashMap,一个带有状态属性的简单项目持有者类会帮助您。查看修改后的代码:

编辑:如果我理解正确,您想在检查状态更改时获取SelectGroupItems 对象吗?如果是这样,请参阅下面的编辑代码:

public class SelectGroupAdaptor extends BaseAdapter {

    Activity activity;
    ArrayList<SelectGroupItemHolder> data = new ArrayList<SelectGroupItemHolder>();

    OnItemCheckStatusChangedListener onItemCheckStatusChangedListener;

    // a item holder class, not a view holder
    private static class SelectGroupItemHolder {
        SelectGroupItems selectGroupItems;
        boolean status;
    }

    public interface OnItemCheckStatusChangedListener {
        public void onItemCheckStatusChanged(SelectGroupItems selectGroupItems, boolean checkStatus, int position);
    }

    public void setOnItemCheckStatusChangedListener(OnItemCheckStatusChangedListener onItemCheckStatusChangedListener) {
        this.onItemCheckStatusChangedListener = onItemCheckStatusChangedListener;
    }

    public SelectGroupAdaptor(Activity activity) {
        this.activity = activity;
    }

    public void add(SelectGroupItems selectGroupItems) {
        SelectGroupItemHolder selectGroupItemHolder = new SelectGroupItemHolder();
        selectGroupItemHolder.selectGroupItems = selectGroupItems;
        this.data.add(selectGroupItemHolder);
        notifyDataSetChanged();
    }

    public ArrayList<SelectGroupItems> getCheckedData() {
        ArrayList<SelectGroupItems> checkedItemList = new ArrayList<SelectGroupItems>();
        for (SelectGroupItemHolder selectGroupItemHolder : data) {
            if (selectGroupItemHolder.status) {
                checkedItemList.add(selectGroupItemHolder.selectGroupItems);
            }
        }
        return checkedItemList;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        TextView textView;
        CheckBox checkBox;
        if (convertView == null) {
            convertView = LayoutInflater.from(activity).inflate(R.layout.layout_select_group_row, null);

        }
        textView = (TextView) convertView.findViewById(R.id.label);
        textView.setTypeface(Util.setCustomFont(activity));
        checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
        textView.setText(data.get(position).selectGroupItems.getGroupName());
        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                data.get(position).status = isChecked;

                if(onItemCheckStatusChangedListener != null) {
                    onItemCheckStatusChangedListener.onItemCheckStatusChanged(data.get(position).selectGroupItems, data.get(position).status, position);
                }
            }
        });
        checkBox.setChecked((data.get(position).status));

        return convertView;
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }
}

设置您的 selectGroupAdapter 实例的检查状态更改侦听器。即:

    selectGroupAdaptor.setOnItemCheckStatusChangedListener(new SelectGroupAdaptor.OnItemCheckStatusChangedListener() {

        @Override
        public void onItemCheckStatusChanged(SelectGroupItems selectGroupItems, boolean checkStatus, int position) {
            // handle check status change
        }
    });

【讨论】:

  • 嗨,谢谢您的回复,但这只会给我checkedItemList,但如果我有5个复选框,前2个是真的,其余3个是假的,我需要这样(checkBox.setChecked((数据.get(position).status));) 并且用户取消选中第二个我只需要那个(位置(2)和状态(假))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 2014-06-05
  • 2015-07-15
  • 2013-10-05
  • 1970-01-01
  • 2017-05-12
相关资源
最近更新 更多