listview由复选框组成

时间:2015-09-19 16:11:41

标签: android

我有一个列表视图的布局,每行包含一个复选框。 活动开始时,会显示复选框,其中一些默认情况下已选中。 最初,我得到正确选中的复选框。但是,当我想取消一些并检查其他人时, 我收到消息后,所有这些都被取消选中了!你不能有超过5个选择!'来自自定义适配器。 我希望能够检查新的盒子或取消选中一些已经从一开始就检查过的盒子。 复选框的总数应小于5。

布局: single_row_item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/checkBox"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/cinteretidtxt"
        android:visibility="gone"/>
</LinearLayout>

自定义适配器: ModCinteretsAdapter

public class ModCinteretsAdapter extends ArrayAdapter<ModCinteret>{
    private ArrayList<String> selectedStrings = new ArrayList<String>();
    private ArrayList<String> selectedids = new ArrayList<String>();

    public ModCinteretsAdapter(Context context, ArrayList<ModCinteret> cinterets) {
        super(context, 0, cinterets);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Get the data item for this position
        ModCinteret cinteret = getItem(position);
        // Check if an existing view is being reused, otherwise inflate the view
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.single_row_item, parent, false);
        }
        // Lookup view for data population
        final TextView cinteretidtxt = (TextView) convertView.findViewById(R.id.cinteretidtxt);
        cinteretidtxt.setText(cinteret.getId());
        final CheckBox cinterettxt = (CheckBox) convertView.findViewById(R.id.checkBox);
        cinterettxt.setText(cinteret.getText());

        if((cinteret.getFlag()).equals("1")) {
            cinterettxt.setChecked(true);
            selectedStrings.add(cinterettxt.getText().toString());
            selectedids.add(cinteretidtxt.getText().toString());
        }else {
            cinterettxt.setChecked(false);
            selectedStrings.remove(cinterettxt.getText().toString());
            selectedids.remove(cinteretidtxt.getText().toString());
        }
        cinterettxt.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    if(selectedStrings.size()<5) {
                        selectedStrings.add(cinterettxt.getText().toString());
                        selectedids.add(cinteretidtxt.getText().toString());
                    }else{
                        cinterettxt.setChecked(false);
                        Toast.makeText(getContext(),"You cannot have more than 5 choices!",Toast.LENGTH_LONG).show();
                    }
                }else{
                    selectedStrings.remove(cinterettxt.getText().toString());
                    selectedids.remove(cinteretidtxt.getText().toString());
                }

            }
        });


        return convertView;
    }

    public ArrayList<String> getSelectedString(){
        return selectedStrings;
    }

    public ArrayList<String> getSelectedId(){
        return selectedids;
    }
}

2 个答案:

答案 0 :(得分:0)

将每个复选框的状态存储在数组

声明一个布尔数组和使用索引来存储特定Chekcbox的值

并将默认设置为您的复选框基于那

SparseBooleanArray sba=new SparseBooleanArray();

答案 1 :(得分:0)

在适配器中添加全局静态变量。

static int nbChecked = 5;

在你的ModCinteret中添加一个布尔值。

boolean isChecked;

不要使用你的旗帜,而是添加。

if(cinteret.getIsChecked()){
    cinterettxt.setChecked(true);
}
else{
    cinterettxt.setChecked(false);
}

最后在你的监听器中将onCheckedChanged更改为:

if(!isChecked){
    cinteret.setIsChecked(false);
    nbChecked--;
    notifyDataSetChanged();
}
else{
    if(nbChecked == 5){
        Toast.makeText(getContext(),"You cannot have more than 5 choices!",Toast.LENGTH_LONG).show();
    }
    else{
        cinteret.setIsCheck(true);
        nbChecked++;
        notifyDataSetChanged();
    }
}

我认为应该这样做。