【问题标题】:Exception while removing the items from android listview从android listview中删除项目时出现异常
【发布时间】:2013-07-25 09:13:49
【问题描述】:

我创建了一个包含内容的列表视图,并为每一行使用了删除按钮。在这里,我尝试使用它的删除按钮从列表视图中删除项目。在删除列表视图的最终元素时,抛出 ArrayIndexOutOfBound 异常。

我用谷歌搜索并找到了一些解决方案,例如:

@Override
    public int getCount() {

        return lsit.size();
    }

Adapter.notifyDataSetChanged();

但是没有一个解决方案不能解决我的问题。

这是我的代码:

public View getView( final int position, View convertView,final ViewGroup parent) {
        final ViewHolder holder;
        System.out.println("saved homes list..");
        System.out.println("Position: "+m_itemClickedPosition_savedHomes);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.nearbyhomestext, null);
            holder = new ViewHolder();

            holder.homeTitle = (TextView) convertView.findViewById(R.id.text_title);
            holder.homePlan = (TextView) convertView.findViewById(R.id.text_plan);
            holder.deleteButton = (Button) convertView.findViewById(R.id.delete_btn);


            holder.activeDrawable = getActivity().getResources().getDrawable(R.drawable.gradient_bg_hover);
            holder.inActiveDrawable = getActivity().getResources().getDrawable(R.drawable.gradient_bg);
            holder.deleteButton.setTag(position);
            //holder.deleteButton.setVisibility(View.INVISIBLE);
            holder.deleteButton.setOnClickListener(
                    new Button.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            System.out.println("Clicked position:"+position);
                            System.out.println("ArraySize:"+m_savedHomesList.size());
                          //Integer index = (Integer) v.getTag();
                              m_savedHomesList.remove(position); 
                              m_savedHomesAdapter.notifyDataSetChanged();
                        }
                    }
                );
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }   


        return convertView;
    }

LogCatError:

    07-25 14:25:56.187: E/AndroidRuntime(5152): FATAL EXCEPTION: main
07-25 14:25:56.187: E/AndroidRuntime(5152): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
07-25 14:25:56.187: E/AndroidRuntime(5152):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
07-25 14:25:56.187: E/AndroidRuntime(5152):     at java.util.ArrayList.remove(ArrayList.java:406)
07-25 14:25:56.187: E/AndroidRuntime(5152):     at com.cpt.realtor.tablet.fragments.HomeListFragment$SavedHomeBaseAdapter$1.onClick(HomeListFragment.java:399)
07-25 14:25:56.187: E/AndroidRuntime(5152):     at android.view.View.performClick(View.java:2485)
07-25 14:25:56.187: E/AndroidRuntime(5152):     at android.view.View$PerformClick.run(View.java:9080)
07-25 14:25:56.187: E/AndroidRuntime(5152):     at android.os.Handler.handleCallback(Handler.java:587)
07-25 14:25:56.187: E/AndroidRuntime(5152):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-25 14:25:56.187: E/AndroidRuntime(5152):     at android.os.Looper.loop(Looper.java:123)
07-25 14:25:56.187: E/AndroidRuntime(5152):     at android.app.ActivityThread.main(ActivityThread.java:3687)
07-25 14:25:56.187: E/AndroidRuntime(5152):     at java.lang.reflect.Method.invokeNative(Native Method)
07-25 14:25:56.187: E/AndroidRuntime(5152):     at java.lang.reflect.Method.invoke(Method.java:507)
07-25 14:25:56.187: E/AndroidRuntime(5152):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
07-25 14:25:56.187: E/AndroidRuntime(5152):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
07-25 14:25:56.187: E/AndroidRuntime(5152):     at dalvik.system.NativeStart.main(Native Method)

需要帮助来解决这个问题..

提前谢谢..

【问题讨论】:

  • index 1, size is 1 => 列表的大小是“1”所以它看起来像这样:[0] 你试图删除第二个单元格 [0][1] 这确实'不存在
  • ListView 的位置也是从零开始的。那为什么position-1
  • @S.D: 我在位置 1 的位置上尝试了位置。结果仍然相同
  • 嘿,您的适配器访问 m_villages,但您正试图从 m_savedHomesList 中删除一个元素。而不是提供部分代码,而是提供您的适配器的完整代码。那么只有其他人才能发现问题所在。
  • 你必须把 Click Listener 放在 "return convertView;" 之前

标签: android listview exception


【解决方案1】:

试试

public int getCount() {
    return m_savedHomesList.size();
}

您正在从 getView(..) 函数中的 m_savedHomesList 中删除。所以适配器应该基于m_savedHomesList。 同样在 getView 方法中,只需使用

notifyDataSetChanged();

而不是 m_savedHomesAdapter.notifyDataSetChanged();

【讨论】:

  • @Lokesh - 编辑了我的评论
  • @Akram Fares:那么,我需要创建任何方法来从数据库中删除数据吗?
  • 我为你的问题创建了一个答案
【解决方案2】:

对于ArrayIndexOutOfBounds,答案是将监听器放在return convertView;notifyDataSetChanged(); 之前,您必须创建一个处理程序:

public View getView( final int position, View convertView,final ViewGroup parent) {
    final ViewHolder holder;
    System.out.println("saved homes list..");
    System.out.println("Position: "+m_itemClickedPosition_savedHomes);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.nearbyhomestext, null);
        holder = new ViewHolder();

        holder.homeTitle = (TextView) convertView.findViewById(R.id.text_title);
        holder.homePlan = (TextView) convertView.findViewById(R.id.text_plan);
        holder.deleteButton = (Button) convertView.findViewById(R.id.delete_btn);


        holder.activeDrawable = getActivity().getResources().getDrawable(R.drawable.gradient_bg_hover);
        holder.inActiveDrawable = getActivity().getResources().getDrawable(R.drawable.gradient_bg);
        holder.deleteButton.setTag(position);
        //holder.deleteButton.setVisibility(View.INVISIBLE);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }   
    // Your listener here
    holder.deleteButton.setOnClickListener(
                new Button.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        System.out.println("Clicked position:"+position);
                        System.out.println("ArraySize:"+m_savedHomesList.size());
                      //Integer index = (Integer) v.getTag();
                          m_savedHomesList.remove(position); 
                          mHandler.setEmptyMessage(0);
                    }
                }
            );

    mHandler =  new Handler() { // Don't forget to declare your handler
     public void handleMessage(Message msg) {
        notifyDataSetChanged();
       }
    };

    return convertView;
}

【讨论】:

    【解决方案3】:

    很高兴知道您已经解决了问题并解决了

    无论如何,我建议您使用不同的方法,因为它会更正确(不过只是一个建议,请仔细考虑)

    • 在适配器中设置一个由活动实现的接口。
    • 当单击删除按钮时,向活动发送回调,其中包含要删除的项目的位置。
    • 在activity中接收到的回调中(位置也在那里接收)更新传递给适配器的arrayList并调用notifyDataSetChanged()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      相关资源
      最近更新 更多