android studio中带有复选框的Listview
我试图创建一个自定义listview,其中包含一个复选框和一个从sqlite数据库检索到的“观察”字符串列表。这个想法是,当我点击“retrieve”按钮时,所有选中的项目都会显示在toast消息中 我可以通过customadapter很好地填充listview,但它似乎无法识别每个复选框的状态,因为无论是否选中,都不会显示toast消息 有人能告诉我哪里出了问题吗 这是我的自定义listview xm,我称之为list\u o: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=
<?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表示您希望访问第一个项目。。因此,该数组中没有第一项。。这就是为什么会出现这个错误