繁体   English   中英

如何在ListView Android中仅获取更新的复选框状态

[英]How to get only updated checkbox status in listview android

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

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

谁能帮我

您不需要HashMap,带有status属性的简单项目持有者类将为您提供帮助。 查看修改后的代码:

编辑:如果我对您的理解正确,那么您想在其检查状态更改时获取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
        }
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM