我有更多Checkbox的GridView,我需要知道什么是checkBox状态。正如帖子末尾所述,当我在XML中插入RelativeLayout,ImageView和TextView时,我收到了错误。
我收到了这个日志:
05-05 22:03:29.375: E/AndroidRuntime(3443): FATAL EXCEPTION: main
05-05 22:03:29.375: E/AndroidRuntime(3443): Process: com.kirolm.instalacionesdep, PID: 3443
05-05 22:03:29.375: E/AndroidRuntime(3443): java.lang.NullPointerException
05-05 22:03:29.375: E/AndroidRuntime(3443): at com.kirolm.instalacionesdep.search.BuscarInstalacionesActividadFragment.ge tItemCheked(BuscarInstalacionesActividadFragment.java:218)
05-05 22:03:29.375: E/AndroidRuntime(3443): at com.kirolm.instalacionesdep.search.BuscarInstalacionesActividadFragment.on OptionsItemSelected(BuscarInstalacionesActividadFragment.java:123)
05-05 22:03:29.375: E/AndroidRuntime(3443): at android.app.Fragment.performOptionsItemSelected(Fragment.java:1806)
05-05 22:03:29.375: E/AndroidRuntime(3443): at android.app.FragmentManagerImpl.dispatchOptionsItemSelected(FragmentManager.java:1972)
05-05 22:03:29.375: E/AndroidRuntime(3443): at android.app.Activity.onMenuItemSelected(Activity.java:2603)
05-05 22:03:29.375: E/AndroidRuntime(3443): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1065)
05-05 22:03:29.375: E/AndroidRuntime(3443): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:741)
05-05 22:03:29.375: E/AndroidRuntime(3443): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
05-05 22:03:29.375: E/AndroidRuntime(3443): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:884)
05-05 22:03:29.375: E/AndroidRuntime(3443): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
05-05 22:03:29.375: E/AndroidRuntime(3443): at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:546)
05-05 22:03:29.375: E/AndroidRuntime(3443): at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:115)
05-05 22:03:29.375: E/AndroidRuntime(3443): at android.view.View.performClick(View.java:4445)
05-05 22:03:29.375: E/AndroidRuntime(3443): at android.view.View$PerformClick.run(View.java:18446)
05-05 22:03:29.375: E/AndroidRuntime(3443): at android.os.Handler.handleCallback(Handler.java:733)
05-05 22:03:29.375: E/AndroidRuntime(3443): at android.os.Handler.dispatchMessage(Handler.java:95)
05-05 22:03:29.375: E/AndroidRuntime(3443): at android.os.Looper.loop(Looper.java:136)
05-05 22:03:29.375: E/AndroidRuntime(3443): at android.app.ActivityThread.main(ActivityThread.java:5146)
05-05 22:03:29.375: E/AndroidRuntime(3443): at java.lang.reflect.Method.invokeNative(Native Method)
05-05 22:03:29.375: E/AndroidRuntime(3443): at java.lang.reflect.Method.invoke(Method.java:515)
05-05 22:03:29.375: E/AndroidRuntime(3443): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
05-05 22:03:29.375: E/AndroidRuntime(3443): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
05-05 22:03:29.375: E/AndroidRuntime(3443): at dalvik.system.NativeStart.main(Native Method)
我有这个XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<ImageView
android:id="@+id/buscar_instalaciones_actividad_fragment_imageview_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="center"
android:src="@drawable/header_buscar_actividad" />
<TextView
android:id="@+id/buscar_instalaciones_actividad_fragment_tv_titulo_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center_horizontal"
android:text="@string/buscar_instalaciones_actividad_fragment_titulo_header"
android:textAppearance="?android:attr/textAppearanceMedium" />
</RelativeLayout>
<GridView
android:id="@+id/buscar_instalaciones_actividad_fragment_gridview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:horizontalSpacing="0dp"
android:numColumns="4"
android:stretchMode="columnWidth"
android:verticalSpacing="0dp" >
</GridView>
这是我的getItemChecked()方法:
public ArrayList<String> getItemCheked(){
ArrayList<String> checkResultArray = new ArrayList<String>();
int count = grid.getAdapter().getCount();
for(int i = 0; i < count; i++){
RelativeLayout itemLayout = (RelativeLayout)grid.getChildAt(i);
CheckBox chb = (CheckBox) itemLayout.findViewById(R.id.buscar_instalaciones_actividad_activity_grid_item_chb);
if(chb.isChecked()){
String valor = (String) chb.getTag();
checkResultArray.add(valor);
Log.e("Checking", "BuscarInstalacionesActividadActivity: El boton pulsado es: "+valor );
}
}
return checkResultArray;
}
第218行是:
CheckBox chb = (CheckBox) itemLayout.findViewById(R.id.buscar_instalaciones_actividad_activity_grid_item_chb);
如果我在我的xml中删除它,它运行正常,但我需要RelativeLayout,ImageView和textView。
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<ImageView
android:id="@+id/buscar_instalaciones_actividad_fragment_imageview_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="center"
android:src="@drawable/header_buscar_actividad" />
<TextView
android:id="@+id/buscar_instalaciones_actividad_fragment_tv_titulo_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center_horizontal"
android:text="@string/buscar_instalaciones_actividad_fragment_titulo_header"
android:textAppearance="?android:attr/textAppearanceMedium" />
</RelativeLayout>
修改 我忘记了,我在自定义适配器内膨胀了复选框。
这是我的适配器中的getView方法。
public View getView(int position, View convertView, ViewGroup parent) {
View grid;
if (convertView == null) {
grid = new View(context);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
grid = inflater.inflate(R.layout.buscar_instalaciones_actividad_activity_grid_check_item, null);
} else {
grid = (View) convertView;
}
tv = (TextView) grid.findViewById(R.id.buscar_instalaciones_actividad_activity_grid_item_text);
tv.setText(items.get(position).getNombreActividad());
chb = (CheckBox) grid.findViewById(R.id.buscar_instalaciones_actividad_activity_grid_item_chb);
chb.setTag(items.get(position).getTipoActividad());
String fotoActividad = items.get(position).getFotoActividad();
fotoActividad = "checkbox_"+fotoActividad;
int imagenParaMostrar = context.getResources().getIdentifier(fotoActividad, "drawable", context.getPackageName());
if(imagenParaMostrar == 0){
fotoActividad = "checkbox_actividad_sinfoto";
imagenParaMostrar = context.getResources().getIdentifier(fotoActividad, "drawable", context.getPackageName());
Log.e("Checking", "CheckableImageGridActividadesAdapter. El nombre de la imagen es: "+fotoActividad);
}
chb.setButtonDrawable(imagenParaMostrar);
tv.setSelected(false);
View.OnClickListener handler = new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setSelected(true);
}
};
tv.setOnClickListener(handler);
return grid;
}
这是buscar_instalaciones_actividad_activity_grid_check_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/album_item"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/white"
android:padding="10dp">
<CheckBox
android:id="@+id/buscar_instalaciones_actividad_activity_grid_item_chb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"/>
<TextView
android:id="@+id/buscar_instalaciones_actividad_activity_grid_item_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/buscar_instalaciones_actividad_activity_grid_item_chb"
android:layout_centerHorizontal="true"
android:ellipsize="marquee"
android:singleLine="true"
android:text="detalles"
android:textColor="@color/Black"
android:textSize="16sp"/>
</RelativeLayout>
答案 0 :(得分:1)
因为你使用grid.getAdapter()。getCount()我相信你想要的是grid.getAdapter()。getItem(i)而不是grid.getChildAt(i)。因为grid.getChildAt(i)似乎返回null,这应该是你问题的原因。
所以只需替换:
RelativeLayout itemLayout = (RelativeLayout)grid.getChildAt(i);
通过:
RelativeLayout itemLayout = (RelativeLayout)grid.getAdapter().getItem(i);
编辑:
抱歉,我错了,忘了getItem不返回视图但是对应的对象。但也许你可以在复选框上设置一个OnCheckedChangeListener来更新项目'Actividad'中的布尔值,并简单地以这种方式得到布尔值:
boolean b = ((Actividad)grid.getAdapter().getItem(i)).getterForTheBoolean();
在getView中:
chb.setOnCheckedChangeListener(new OnCheckedChangeListener(){
//....
items.get(position).setterForTheBoolean(isChecked);
});