java - 使用 GridView 时 Android 中的 ArrayOut of Bound 异常

标签 java android

@Override
public View getView(final int position, View view, ViewGroup parent) {
     view = _lInflater.inflate(R.layout.all_apps_checked_item, null);
     CheckBox chkUhkItem = (CheckBox) view.findViewById(R.id.all_apps_cb);
     chkUhkItem.setOnCheckedChangeListener(new OnCheckedChangeListener() {

         @Override
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
             _iCheckBoxClick.onCheckCliked(isChecked,_apps.get(position).packageName,position);
         }
      });
      return view;
}

我的公共(public)接口(interface)是

public interface ICheckBoxClick{
    void onCheckCliked(boolean isChecked,String packageName,int pos);
}

我对 ICheckBoxClick 的实现是:

//Apps Seletion Dialog
public void showSeletionAppsDialog(Context actityCtx,
        final String cat_name, final IAddSubItemsClick iAddSubItemsClick) {
    final ArrayList<String> selected = new ArrayList<String>();
    final Dialog dialog = new Dialog(actityCtx);
    dialog.setTitle("Select Apps =>" + cat_name);
    dialog.setContentView(R.layout.all_apps_grid);
    GridView appsGrid = (GridView) dialog.findViewById(R.id.all_apps);
    ICheckBoxClick icheckBoxClick = new ICheckBoxClick() {

        @Override
        public void onCheckCliked(boolean isChecked, String pkgName, int pos) {
            if (isChecked) {
                selected.add(cat_name + "," + pkgName);
            } else {
                selected.remove(pos);
            }
        }
    };
    appsGrid.setAdapter(new AllAppsSelectionAdapter(actityCtx,
            icheckBoxClick));
}

Selected.remove(pos) 抛出 Array out of bound 异常。

12-30 12:59:18.106: E/AndroidRuntime(13028): java.lang.IndexOutOfBoundsException: Invalid index 7, size is 1
12-30 12:59:18.106: E/AndroidRuntime(13028):    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
12-30 12:59:18.106: E/AndroidRuntime(13028):    at java.util.ArrayList.remove(ArrayList.java:403)

从上面的日志中,我了解到 ArrayList 的大小仅为 1,而您正试图删除 & 元素。因此 arrayOutOfBoundException。我没有更好的解决方案来解决这个问题。

最佳答案

use remove(Object object) method instead remove(int index)

问题就在这里..

    if (isChecked) {
            selected.add(cat_name + "," + pkgName);
        } else {
            selected.remove(pos);
        }

您正在将 String 添加到 Arraylist...但是您正在从 Arraylist 中删除 int..如果您在 ListView 中添加了第一项..只有一项..如果您添加了第 5 项,则有两个元素..如果您删除第 5 个元素,您将删除 remove(5) 但只有两个元素..所以使用remove(object object) 方法而不是 remove(int index) 改变你的代码......

 if (isChecked) {
            selected.add(cat_name + "," + pkgName);
        } else {
            selected.remove(cat_name + "," + pkgName);
        }

关于java - 使用 GridView 时 Android 中的 ArrayOut of Bound 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20835298/

相关文章:

android - 回收者查看列表到服务器

android - 在线性布局中使用 inflator 添加表格行

java - AdMob NativeExpressAds 拒绝显示在实际的 Android 设备上

Android:滑动页面时未触发 OnItemClickListener 事件(FragmentActivity 和 ListFragment)

java - 当其下方的列表组件(不重叠)与之交互时,achartengine 图重绘不正确

java - Java GUI 总是更新缓慢还是只有我这样?

java - Android 数据绑定(bind)单选组

Android Kotlin - 如何将命名函数传递给另一个函数中的 DialogInterface.OnClickListener 参数?

java - Android - 如何返回到之前的不同 Activity

java - JSON 到 Android 错误