自定义网格视图,图像和复选框崩溃
custom grid view, with image and checkbox crashing
在 MainActivity.java 我正在从一个 txt 文件中读取一个列表,然后在显示列表按钮上我可以使用自定义网格视图显示该列表,其中包含列表项、图像和复选框。现在单击另一个按钮,我试图获取选中项目的位置,以便我可以使用这些选定的项目。我的代码在 . view.getCheckedItemPositions();
MainActivity.java
if(v.getId()==R.id.toast)
{
Toast.makeText(this,"positions" + adapter.getCheckedItemPositions(view), Toast.LENGTH_SHORT).show();
}
}
public class CustomAdapter extends BaseAdapter {
@Override
public View getView(int position, View view, ViewGroup parent) {
LinearLayout layout = new LinearLayout(getApplicationContext());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
view = new View(getApplicationContext());
TextView text=new TextView(getApplicationContext());
text.setTextColor(Color.BLACK);
text.setText(content.get(position));
CheckBox checkBox = new CheckBox(getApplicationContext());
checkBox.setChecked(!checkBox.isChecked());
checkBox.setChecked(true);
layout.addView(checkBox);
layout.addView(text);
return layout;
}
public List<Integer> getCheckedItemPositions(GridView view){
SparseBooleanArray checked = new SparseBooleanArray();
checked = view.getCheckedItemPositions();
List<Integer> positions = new ArrayList<>();
int checksize=checked.size();
for(int i=0; i<checksize; i++) {
if (checked.valueAt(i)) {
positions.add(checked.keyAt(i));
}
}
return positions;
}
}
}
Activity_main.xml
<GridView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/gridView"
android:layout_below="@+id/button"
android:layout_alignParentStart="true"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Toast"
android:id="@+id/toast"
android:layout_alignParentTop="true"
android:layout_alignEnd="@+id/gridView"
android:layout_marginEnd="49dp" />
</RelativeLayout>
logcat
------------崩溃开始
09-18 18:31:49.144 31751-31751/com.example.administrator.myapplication E/AndroidRuntime:致命异常:main
进程:com.example.administrator.myapplication,PID:31751
java.lang.NullPointerException: 尝试在空对象引用上调用虚方法 'int android.util.SparseBooleanArray.size()'
在 com.example.administrator.myapplication.MainActivity$CustomAdapter.getCheckedItemPositions(MainActivity.java:158)
在 com.example.administrator.myapplication.MainActivity.onClick(MainActivity.java:96)
在 android.view.View.performClick(View.java:4780)
在 android.view.View$PerformClick.run(View.java:19866)
在 android.os.Handler.handleCallback(Handler.java:739)
在 android.os.Handler.dispatchMessage(Handler.java:95)
在 android.os.Looper.loop(Looper.java:135)
在 android.app.ActivityThread.main(ActivityThread.java:5257)
在 java.lang.reflect.Method.invoke(本机方法)
在 java.lang.reflect.Method.invoke(Method.java:372)
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
09-18 18:32:26.135 31751-31758/com.example.administrator.myapplication W/art:暂停所有线程耗时:102.748ms
09-18 18:32:27.078 31751-31758/com.example.administrator.myapplication W/art﹕暂停所有线程耗时:78.288ms
我得到答案了..
我创建了一个 link 哈希映射,其中字符串作为复选框的位置,值作为该位置的布尔值。喜欢
LinkedHashMap mylist = new LinkedHashMap<>();
现在为了获取选中项的状态并在运行时对其进行监控,我们必须使用
在复选框上设置监听器
checkBox.setOnCheckedChangeListener();
或//
checkbox.setOnClickListener()
这两部作品之一。
早些时候我只是设置复选框,但没有像上面那样在复选框上设置监听器
checkBox.setChecked(!checkBox.isChecked());
checkBox.setChecked(真);
现在使用 setOnClickListener,我所要做的就是将复选框的位置和布尔值存储到 LinkHashmap。
checkBox.setOnClickListener(新View.OnClickListener() {
public void onClick(View v) {
if (((CheckBox) v).isChecked()) {
saveValues("check" + position, true);
Toast.makeText(MainActivity.this,"position: "+getValues("check"+position), Toast.LENGTH_SHORT).show();
}
else {
saveValues("check"+position,false);
}
}
});
稍后我可以使用
查看选中的项目
public Boolean getValues(String a){
return mylist.get(a).booleanValue();
}
非常感谢下面的贡献者post
Android: checkbox listener
在 MainActivity.java 我正在从一个 txt 文件中读取一个列表,然后在显示列表按钮上我可以使用自定义网格视图显示该列表,其中包含列表项、图像和复选框。现在单击另一个按钮,我试图获取选中项目的位置,以便我可以使用这些选定的项目。我的代码在 . view.getCheckedItemPositions();
MainActivity.java
if(v.getId()==R.id.toast)
{
Toast.makeText(this,"positions" + adapter.getCheckedItemPositions(view), Toast.LENGTH_SHORT).show();
}
}
public class CustomAdapter extends BaseAdapter {
@Override
public View getView(int position, View view, ViewGroup parent) {
LinearLayout layout = new LinearLayout(getApplicationContext());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
view = new View(getApplicationContext());
TextView text=new TextView(getApplicationContext());
text.setTextColor(Color.BLACK);
text.setText(content.get(position));
CheckBox checkBox = new CheckBox(getApplicationContext());
checkBox.setChecked(!checkBox.isChecked());
checkBox.setChecked(true);
layout.addView(checkBox);
layout.addView(text);
return layout;
}
public List<Integer> getCheckedItemPositions(GridView view){
SparseBooleanArray checked = new SparseBooleanArray();
checked = view.getCheckedItemPositions();
List<Integer> positions = new ArrayList<>();
int checksize=checked.size();
for(int i=0; i<checksize; i++) {
if (checked.valueAt(i)) {
positions.add(checked.keyAt(i));
}
}
return positions;
}
}
}
Activity_main.xml
<GridView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/gridView"
android:layout_below="@+id/button"
android:layout_alignParentStart="true"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Toast"
android:id="@+id/toast"
android:layout_alignParentTop="true"
android:layout_alignEnd="@+id/gridView"
android:layout_marginEnd="49dp" />
</RelativeLayout>
logcat
------------崩溃开始 09-18 18:31:49.144 31751-31751/com.example.administrator.myapplication E/AndroidRuntime:致命异常:main 进程:com.example.administrator.myapplication,PID:31751 java.lang.NullPointerException: 尝试在空对象引用上调用虚方法 'int android.util.SparseBooleanArray.size()' 在 com.example.administrator.myapplication.MainActivity$CustomAdapter.getCheckedItemPositions(MainActivity.java:158) 在 com.example.administrator.myapplication.MainActivity.onClick(MainActivity.java:96) 在 android.view.View.performClick(View.java:4780) 在 android.view.View$PerformClick.run(View.java:19866) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5257) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 09-18 18:32:26.135 31751-31758/com.example.administrator.myapplication W/art:暂停所有线程耗时:102.748ms 09-18 18:32:27.078 31751-31758/com.example.administrator.myapplication W/art﹕暂停所有线程耗时:78.288ms
我得到答案了..
我创建了一个 link 哈希映射,其中字符串作为复选框的位置,值作为该位置的布尔值。喜欢
LinkedHashMap mylist = new LinkedHashMap<>();
现在为了获取选中项的状态并在运行时对其进行监控,我们必须使用
在复选框上设置监听器checkBox.setOnCheckedChangeListener();
或//
checkbox.setOnClickListener()
这两部作品之一。
早些时候我只是设置复选框,但没有像上面那样在复选框上设置监听器
checkBox.setChecked(!checkBox.isChecked()); checkBox.setChecked(真);
现在使用 setOnClickListener,我所要做的就是将复选框的位置和布尔值存储到 LinkHashmap。
checkBox.setOnClickListener(新View.OnClickListener() {
public void onClick(View v) {
if (((CheckBox) v).isChecked()) {
saveValues("check" + position, true);
Toast.makeText(MainActivity.this,"position: "+getValues("check"+position), Toast.LENGTH_SHORT).show();
}
else {
saveValues("check"+position,false);
}
}
});
稍后我可以使用
查看选中的项目 public Boolean getValues(String a){
return mylist.get(a).booleanValue();
}
非常感谢下面的贡献者post
Android: checkbox listener