【问题标题】:ArrayAdapter IndexOutOfBoundsExceptionArrayAdapter IndexOutOfBoundsException
【发布时间】:2012-11-26 15:45:10
【问题描述】:

我正在尝试通过 onclick 操作从列表视图中删除一个项目。但我得到了 arrayindexoutofbound 异常。我从 11 大小的数组中删除了项目,但它仍在尝试获取 11. 项目。

        public void onClick(View v) {
            data.remove(getItemIndexByID(filteredData.get(position).getID()));
            filteredData.remove(position);      
            notifyDataSetChanged();

            flipMenu(lastHolder, 1);
            showPopup("Item Deleted"); 


        }

日志:

    11-26 17:16:32.159: E/AndroidRuntime(26991): FATAL EXCEPTION: main
11-26 17:16:32.159: E/AndroidRuntime(26991): java.lang.IndexOutOfBoundsException: Invalid index 10, size is 10
11-26 17:16:32.159: E/AndroidRuntime(26991):    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at java.util.ArrayList.get(ArrayList.java:304)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at com.innovationbox.passlocker.adapters.ListViewAdapter.getView(ListViewAdapter.java:100)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.widget.AbsListView.obtainView(AbsListView.java:2143)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.widget.ListView.makeAndAddView(ListView.java:1831)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.widget.ListView.fillDown(ListView.java:674)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.widget.ListView.fillGap(ListView.java:638)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4930)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4087)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.view.Choreographer.doCallbacks(Choreographer.java:562)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.view.Choreographer.doFrame(Choreographer.java:531)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.os.Handler.handleCallback(Handler.java:725)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.os.Handler.dispatchMessage(Handler.java:92)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.os.Looper.loop(Looper.java:137)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at android.app.ActivityThread.main(ActivityThread.java:5039)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at java.lang.reflect.Method.invokeNative(Native Method)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at java.lang.reflect.Method.invoke(Method.java:511)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-26 17:16:32.159: E/AndroidRuntime(26991):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • position 来自哪里?
  • position 第二次似乎是错误的。是否正确更新?
  • 位置在这里; @Override public View getView(final int position, View convertView, ViewGroup parent)
  • onclick 方法在 getView 方法中。我正在使用 getView 的位置值
  • 数据如何声明?如果你有一个List<Integer> 的后代,它会完全混淆List.remove 方法。

标签: android


【解决方案1】:

我注意到 ArrayAdapter 的 getcount 方法总是返回相同的值,我像这样重写了 getCount() 方法,它可以工作。

@Override
public int getCount() {
    return filteredData.size();
}

【讨论】:

  • 在我的情况下这还不够,getItem 也必须被覆盖,这里有一个例子:stackoverflow.com/a/17045297/891479
  • 覆盖并返回filteredData.size(),主要做的事情
  • 谢谢,就是这样。经验教训,当我们覆盖过滤器时,我们会覆盖 getFilter() AND getCount() 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 2023-03-27
  • 2013-09-30
  • 2015-06-16
相关资源
最近更新 更多