自定义网格视图,图像和复选框崩溃

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