【问题标题】:IndexOutOfBoundsException in onItemClick ListViewonItemClick ListView 中的 IndexOutOfBoundsException
【发布时间】:2016-03-17 07:17:41
【问题描述】:

我有一个带有对象数组的简单 BaseAdatper。我也有listView。使用 setAdatper() 方法将 Adatper 包含到 listView 中。

我在 listView 上有 onItemClick 侦听器。我收到了:

Fatal Exception: java.lang.IndexOutOfBoundsException
Invalid index 0, size is 0

我不明白为什么。因为如果适配器为空,它应该可以工作onItemClick。它看起来像在 listView 上显示的项目,但如果我在 onItemClick 中调用 getItem(),则适配器为空。为什么?

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, final View view, final int position, long id) {
                    UserModel user = (UserModel) listView.getAdapter().getItem(position);

                    showFragment(UserDetailsFragment.newInstance(user.getId(), new UserDetailsFragment.OnFollowListener() {
                        @Override
                        public void onFollow(boolean value) {
                            ((UserModel) listView.getAdapter().getItem(position)).setFollowedBy(value);
                            view.findViewById(R.id.following_user).setSelected(value);
                        }
                    }), UserDetailsFragment.TAG);
                }
        });

【问题讨论】:

  • 可能是这一行,((UserModel) listView.getAdapter().getItem(position)).setFollowedBy(value);,因为您正在从适配器获取项目,而适配器中没有任何项目
  • 是的,但这应该是不可能的(当没有项目时你怎么能点击一个项目?)
  • 尝试在访问项目之前比较位置。
  • 是的,有可能,您是否在适配器方法中添加了getItem() 以返回对象UserModel?并确保将对象传递给适配器。
  • 方法getItem()被定义并返回对象。我认为你是对的:((UserModel) listView.getAdapter().getItem(position)).setFollowedBy(value); 因为当适配器可能为空时它会触发。但为什么。谢谢,我会检查

标签: android listview android-listview indexoutofboundsexception


【解决方案1】:

您是否覆盖了方法getItem()?如果是的话,里面是什么。

【讨论】:

  • 是的。它从数组适配器返回对象
  • 如果你的列表视图有一个标题视图,你就不会得到你自己的适配器。这也可能导致问题。
  • 谢谢。我没有标题视图 :)
【解决方案2】:

首先:如果您的数组列表为空,则表示您的列表视图中不包含任何项目。你没有机会'OnItemClick'。

第二:请检查你的适配器类错误你可能从空数组列表中得到一个对象,请检查。 'getCount()' 和 'getItem(int position)' 方法中的以下条件供参考检查下面的代码。

 class TestAdapter extends BaseAdapter {

    private ArrayList<Object> arrayList;

    // Do your Stuff

    public TestAdapter(ArrayList<Object> arrayList) {
        // Do your Stuff
        this.arrayList = arrayList;
    }

    @Override
    public int getCount() {
        return arrayList != null ? arrayList.size() : 0;
    }

    @Override
    public Object getItem(int position) {
        return (arrayList != null && arrayList.size() >= position) ? arrayList.get(position) : null;
    }

    @Override
    public long getItemId(int position) {
        // Do your Stuff
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Do your Stuff
        return null;
    }
}

【讨论】:

  • 更改数组列表后,您需要立即调用 update(); .我认为'IndexOutOfBoundsException'的这个原因在'add(S item)'以及'clear()'方法中调用'update()'方法
猜你喜欢
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多