拆卸ArrayList的元素扔在ArrayAdapter抛出IndexOutOfBoundsException [英] Removing elements on ArrayList throw an IndexOutOfBoundsException on ArrayAdapter

查看:304
本文介绍了拆卸ArrayList的元素扔在ArrayAdapter抛出IndexOutOfBoundsException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开发一个Android 3.1应用程序。

我有我的自定义ArrayAdapter。我要显示在ListView名称的列表。

这些名字的形式,可能是下载并存储在本地。当用户下载并保存一个或多个,我称之为 updateFormsNotDownloaded()。但是,当我这样做,我得到一个IndexOutOfBoundsException异常。我想这个问题是因为我称之为 notifyDataSetChanged()

看我的code:

 公共类FormAdapter扩展ArrayAdapter<表格>
{
    私人上下文的背景下;
    私人诠释layoutResourceId;
    私人列表<表格>形式;
    私人的ArrayList<整数GT; checkedItemsPosition;
    私人按钮downloadButton;

    公众的ArrayList<整数GT; getCheckedItemsPosition()
    {
        返回checkedItemsPosition;
    }

    公众的String [] getSelectedFormsId()
    {
        的String [] IDS =新的String [checkedItemsPosition.size()];
        INT I = 0;
        对于(整数POS:checkedItemsPosition)
        {
            表格F = forms.get(pos.intValue());
            IDS [我] = f.FormId;
            我++;
        }
        返回的ID;
    }

    / **
     *选择调用形式已被下载时,并在本地正确的储存。
     * /
    公共无效updateFormsNotDownloaded()
    {
        ArrayList的<表格> copyForms =新的ArrayList<表格>();
        的for(int i = 0; I< forms.size();我++)
        {
            如果(!checkedItemsPosition.contains(新整数(ⅰ)))
                copyForms.add(forms.get(ⅰ));
        }
        形式= copyForms;
        checkedItemsPosition.clear();
        notifyDataSetChanged();
    }

    公共FormAdapter(上下文的背景下,INT textViewResourceId,
            名单<表格>对象,按钮downloadButton)
    {
        超(背景下,textViewResourceId,对象);

        this.context =背景;
        this.layoutResourceId = textViewResourceId;
        this.forms =物体;
        this.checkedItemsPosition =新的ArrayList<整数GT;();
        this.downloadButton = downloadButton;
    }

    @覆盖
    公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup)
    {
        查看排= convertView;
        如果(行== NULL)
        {
            LayoutInflater充气=((活动)上下文).getLayoutInflater();
            行= inflater.inflate(layoutResourceId,父母,假);
        }

        表格F = forms.get(位置);
        如果(F!= NULL)
        {
            复选框复选框=(复选框)row.findViewById(R.id.itemCheckBox);
            如果(复选框!= NULL)
            {
                checkBox.setText(f.Name);
                checkBox.setOnCheckedChangeListener(新OnCheckedChangeListener()
                {
                    公共无效onCheckedChanged(CompoundButton buttonView,
                            布尔器isChecked)
                    {
                        // FORM F = forms.get(位置);
                        如果(器isChecked)
                        {
                            //checkedItems.add(f.FormId);
                            checkedItemsPosition.add(新的整数(位置));
                        }
                        其他
                        {
                            //checkedItems.remove(checkedItems.indexOf(f.FormId));
                            checkedItemsPosition.remove(checkedItemsPosition.indexOf(新的整数(位置)));
                        }
                        downloadButton.setEnabled(checkedItemsPosition.size()大于0);
                    }
                });
            }
        }

        返回行;
    }
}
 

我有三个项目的形式,但我删除其中的一个。

为什么会出现这个异常?

这是异常日志:

  java.lang.IndexOutOfBoundsException:无效的索引2,大小为2
在java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
在java.util.ArrayList.get(ArrayList.java:308)
在es.viacognita.adapters.FormAdapter.getView(FormAdapter.java:89)
在android.widget.AbsListView.obtainView(AbsListView.java:1949)
在android.widget.ListView.makeAndAddView(ListView.java:1756)
在android.widget.ListView.fillDown(ListView.java:656)
在android.widget.ListView.fillSpecific(ListView.java:1314)
在android.widget.ListView.layoutChildren(ListView.java:1587)
在android.widget.AbsListView.onLayout(AbsListView.java:1800)
在android.view.View.layout(View.java:9581)
在android.view.ViewGroup.layout(ViewGroup.java:3877)
在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1542)
在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1403)
在android.widget.LinearLayout.onLayout(LinearLayout.java:1314)
在android.view.View.layout(View.java:9581)
在android.view.ViewGroup.layout(ViewGroup.java:3877)
在android.widget.FrameLayout.onLayout(FrameLayout.java:400)
在android.view.View.layout(View.java:9581)
在android.view.ViewGroup.layout(ViewGroup.java:3877)
在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1542)
在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1403)
在android.widget.LinearLayout.onLayout(LinearLayout.java:1314)
在android.view.View.layout(View.java:9581)
在android.view.ViewGroup.layout(ViewGroup.java:3877)
在android.widget.FrameLayout.onLayout(FrameLayout.java:400)
在android.view.View.layout(View.java:9581)
在android.view.ViewGroup.layout(ViewGroup.java:3877)
在android.view.ViewRoot.performTraversals(ViewRoot.java:1253)
在android.view.ViewRoot.handleMessage(ViewRoot.java:2003)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:132)
在android.app.ActivityThread.main(ActivityThread.java:4025)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:491)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:841)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
在dalvik.system.NativeStart.main(本机方法)
 

解决方案

重写getCount将()。并返回值forms.size()在里面。

I'm developing an Android 3.1 application.

I have my custom ArrayAdapter. I want to show a list of names in a ListView.

These names are forms that could be download and save it locally. When user download and save one or more, I call updateFormsNotDownloaded(). But when I do that I get an IndexOutOfBoundsException. And I think this problem is because I call notifyDataSetChanged().

Look at my code:

public class FormAdapter extends ArrayAdapter<Form>
{
    private Context context;
    private int layoutResourceId;
    private List<Form> forms;
    private ArrayList<Integer> checkedItemsPosition;
    private Button downloadButton;

    public ArrayList<Integer> getCheckedItemsPosition()
    {
        return checkedItemsPosition;
    }

    public String[] getSelectedFormsId()
    {
        String[] ids = new String[checkedItemsPosition.size()];
        int i = 0;
        for(Integer pos : checkedItemsPosition)
        {
            Form f = forms.get(pos.intValue());
            ids[i] = f.FormId;
            i++;
        }
        return ids;
    }

    /**
     * Called when selected forms has been downloaded and save it locally correctly.
     */
    public void updateFormsNotDownloaded()
    {
        ArrayList<Form> copyForms = new ArrayList<Form>();
        for (int i = 0; i < forms.size(); i++)
        {
            if (!checkedItemsPosition.contains(new Integer(i)))
                copyForms.add(forms.get(i));
        }
        forms = copyForms;
        checkedItemsPosition.clear();
        notifyDataSetChanged();
    }

    public FormAdapter(Context context, int textViewResourceId,
            List<Form> objects, Button downloadButton)
    {
        super(context, textViewResourceId, objects);

        this.context = context;
        this.layoutResourceId = textViewResourceId;
        this.forms = objects;
        this.checkedItemsPosition = new ArrayList<Integer>();
        this.downloadButton = downloadButton;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        View row = convertView;
        if (row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
        }

        Form f = forms.get(position);
        if (f != null)
        {
            CheckBox checkBox = (CheckBox)row.findViewById(R.id.itemCheckBox);
            if (checkBox != null)
            {
                checkBox.setText(f.Name);
                checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
                {
                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked)
                    {
                        //Form f = forms.get(position);
                        if (isChecked)
                        {
                            //checkedItems.add(f.FormId);
                            checkedItemsPosition.add(new Integer(position));
                        }
                        else
                        {
                            //checkedItems.remove(checkedItems.indexOf(f.FormId));
                            checkedItemsPosition.remove(checkedItemsPosition.indexOf(new Integer(position)));
                        }
                        downloadButton.setEnabled(checkedItemsPosition.size() > 0);
                    }
                });
            }
        }

        return row;
    }
}

I had three items on forms, but I remove one of them.

Why am I getting that exception?

This is exception log:

java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at es.viacognita.adapters.FormAdapter.getView(FormAdapter.java:89)
at android.widget.AbsListView.obtainView(AbsListView.java:1949)
at android.widget.ListView.makeAndAddView(ListView.java:1756)
at android.widget.ListView.fillDown(ListView.java:656)
at android.widget.ListView.fillSpecific(ListView.java:1314)
at android.widget.ListView.layoutChildren(ListView.java:1587)
at android.widget.AbsListView.onLayout(AbsListView.java:1800)
at android.view.View.layout(View.java:9581)
at android.view.ViewGroup.layout(ViewGroup.java:3877)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1542)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1403)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1314)
at android.view.View.layout(View.java:9581)
at android.view.ViewGroup.layout(ViewGroup.java:3877)
at android.widget.FrameLayout.onLayout(FrameLayout.java:400)
at android.view.View.layout(View.java:9581)
at android.view.ViewGroup.layout(ViewGroup.java:3877)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1542)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1403)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1314)
at android.view.View.layout(View.java:9581)
at android.view.ViewGroup.layout(ViewGroup.java:3877)
at android.widget.FrameLayout.onLayout(FrameLayout.java:400)
at android.view.View.layout(View.java:9581)
at android.view.ViewGroup.layout(ViewGroup.java:3877)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1253)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2003)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4025)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)

解决方案

Override getCount(). And return the value forms.size() in it.

这篇关于拆卸ArrayList的元素扔在ArrayAdapter抛出IndexOutOfBoundsException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆