android studio中带有复选框的Listview

android studio中带有复选框的Listview,android,listview,checkbox,Android,Listview,Checkbox,我试图创建一个自定义listview,其中包含一个复选框和一个从sqlite数据库检索到的“观察”字符串列表。这个想法是,当我点击“retrieve”按钮时,所有选中的项目都会显示在toast消息中 我可以通过customadapter很好地填充listview,但它似乎无法识别每个复选框的状态,因为无论是否选中,都不会显示toast消息 有人能告诉我哪里出了问题吗 这是我的自定义listview xm,我称之为list\u o: <?xml version="1.0" encoding=

我试图创建一个自定义listview,其中包含一个复选框和一个从sqlite数据库检索到的“观察”字符串列表。这个想法是,当我点击“retrieve”按钮时,所有选中的项目都会显示在toast消息中

我可以通过customadapter很好地填充listview,但它似乎无法识别每个复选框的状态,因为无论是否选中,都不会显示toast消息

有人能告诉我哪里出了问题吗

这是我的自定义listview xm,我称之为list\u o:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
android:id="@+id/obsgrid">

    <CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/chkbx"
    android:layout_row="0"
    android:layout_column="0" />

   <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Large Text"
    android:id="@+id/obs"
    android:layout_row="0"
    android:layout_column="1" />

这是我的自定义适配器:

class CustomAdObs extends ArrayAdapter<String> {

private String [] observation;
private Boolean [] checked;
private Context context;

public CustomAdObs(Context context, String[] observation) {
    super(context, R.layout.list_o, observation);
    this.observation = observation;
    this.checked = checked;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater siteInflater = LayoutInflater.from(getContext());
    View customView = siteInflater.inflate(R.layout.list_o, parent, false);

    TextView observationTV = (TextView) customView.findViewById(R.id.obs);
    CheckBox checkCB = (CheckBox) customView.findViewById(R.id.chkbx);

    checkCB.setTag(Integer.valueOf(position)); 

    observationTV.setText(observation[position]);
    checkCB.setChecked(checked[position]);

    return customView;
}
类CustomAdObs扩展了ArrayAdapter{
私有字符串[]观察;
检查私有布尔[];
私人语境;
公共CustomAdObs(上下文,字符串[]观察){
超级(上下文、右布局、列表、观察);
观察=观察;
this.checked=checked;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutInflater siteInflater=LayoutInflater.from(getContext());
View customView=siteInflater.inflate(R.layout.list_o,父项,false);
TextView observationTV=(TextView)customView.findViewById(R.id.obs);
复选框checkCB=(复选框)customView.findviewbyd(R.id.chkbx);
检查cb.setTag(Integer.valueOf(position));
observationTV.setText(观察[位置]);
检查CB.setChecked(检查[位置]);
返回自定义视图;
}
}

最后是我的活动:

public class selobs extends Activity {

List< List<String> > listArray = new ArrayList< List<String> >();
List<String> array1 = new ArrayList<String>();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode. setThreadPolicy(policy);
    setContentView(R.layout.activity_selobs);

    final Button retrieve= (Button) findViewById(R.id.btnret);
    final EditText txtob = (EditText) findViewById(R.id.editText23);

    filladapter();

    retrieve.setOnClickListener(
            new View.OnClickListener() {
                public void onClick(View view) {

                    ListView obsListView = (ListView) findViewById(R.id.obsList);
                    View v;

                    for (int i = 0; i < obsListView.getCount(); i++) {
                        v = obsListView.getAdapter().getView(i, null, null);
                        CheckBox check = (CheckBox) v.findViewById(R.id.chkbx);
                        TextView obsItem = (TextView) v.findViewById(R.id.obs);

                        if (check.isChecked()) {
                            String p = obsItem.getText().toString();
                            Toast.makeText(selobs.this, p, Toast.LENGTH_LONG).show();
                        }

                    }
                }
            }
    );
}


public void filladapter(){

    myDBhandler1 dbHandler;
    dbHandler = new myDBhandler1(selobs.this, null, null, 1);
    listArray = dbHandler.databaseToStringObs();

    List array1 = listArray.get(0);

    String[] observ = (String[]) array1.toArray(new String[0]);
    Boolean[] checked = new Boolean[0];
    Arrays.fill(checked, Boolean.FALSE);

    final ListAdapter ObsAdapter = new CustomAdObs(this, observ, checked);
    final ListView obsListView = (ListView) findViewById(R.id.obsList);

    obsListView.setAdapter(ObsAdapter);

    obsListView.setOnItemClickListener(
            new AdapterView.OnItemClickListener(){
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    String item = String.valueOf(parent.getItemAtPosition(position));
                    Toast.makeText(selobs.this, item, Toast.LENGTH_LONG).show();

                    TextView txtobs = (TextView) findViewById(R.id.editText23);

                    txtobs.setText(item);


                }
            }
    );


}
公共类selobs扩展活动{
Listlistary=newarraylist();
List array1=新的ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(策略);
setContentView(R.layout.activity_selobs);
最终按钮检索=(按钮)findViewById(R.id.btnret);
final EditText txtob=(EditText)findViewById(R.id.editText23);
filladapter();
retrieve.setOnClickListener(
新建视图。OnClickListener(){
公共void onClick(视图){
ListView OBListView=(ListView)findViewById(R.id.obsList);
观点五;
对于(int i=0;i
}您的构造函数

public CustomAdObs(Context context, String[] observation) {//here the Boolean[] checked ->is messing 
super(context, R.layout.list_o, observation);
this.observation = observation;
this.checked = checked;
 } 
所以你用这个来代替它

public CustomAdObs(Context context, String[] observation, Boolean[] checked) {
    super(context, R.layout.list_o, observation);
    this.observation = observation;
    this.checked = checked;
}
为什么?

因为你这样称呼它

    new CustomAdObs(this, observ, checked);

虽然构造函数中只有两个参数(上下文,字符串[]观察)

谢谢Charef。我按照建议解决了这个问题,但当我运行应用程序并点击“检索”时,它仍然无法识别我是否选中了该框(即没有显示toast消息)。我还注释掉了checkCB.setChecked行(checked[position]);引发异常的:java.lang.ArrayIndexOutOfBoundsException:length=0;index=0表示选中的布尔[]数组为空。。长度=0表示它是空的。。index=0表示您希望访问第一个项目。。因此,该数组中没有第一项。。这就是为什么会出现这个错误