我正在开发一个 Android 3.1 应用程序。
我已经使用 ArrayList 创建了自定义 ArrayAdapter。 Form 是一个自定义类,有两个字段:name 和 FormId。
这是我的 ArrayAdapter 代码:
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()
{
for (Integer pos : checkedItemsPosition)
{
remove(forms.get(pos.intValue()));
}
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 int getCount()
{
return forms.size();
}
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
Log.v("FormAdapter", "getView.postion: " + position);
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;
}
}
列表项是带有复选框的自定义项。在 checkedItemsPosition
上,我存储选中项目的位置。
我的问题出在 updateFormsNotDownloaded
方法上。为什么我会收到 UnsupportedOperationException
?
最佳答案
我只能想到一个原因。传递给 ArrayAdapters 构造函数的 List<> 实现不支持 remove()。您可以使用 ArrayList 来解决这个问题。 如果由于某种原因您使用 Arrays.asList() 从数组构建列表,您将得到一个无法修改的列表。
The size of the
* {@code List} cannot be modified, i.e. adding and removing are unsupported
关于java - 从 ArrayList<Form> 中删除会抛出 UnsupportedOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10208356/