问题描述
我开发一个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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!