我使用notifyDataSetChanged时IndexOutOfBoundException

时间:2012-08-16 15:17:05

标签: android baseadapter

我在这篇文章中提出了我的问题Updating ExpandableListView with notifyDataSetChanged()

“每次使用setNotifyDatasetChanged刷新视图时,适配器都会调用List周围的循环。并​​且由于您所做的更改,适配器中的List会获得一个空值。”

我是初学者,无法正确更改列表

我的消息来源

public class UrlArrayAdapter extends ArrayAdapter<UrlItem> {

    private LayoutInflater inflater;
    private ListView urlListView1;
    private ArrayList<UrlItem> urlItems1;

    public UrlArrayAdapter(Context context, ListView urlListView,
            ArrayList<UrlItem> urlLists) {
        super(context, urlListView.getId(), urlLists);
        this.urlItems1 = urlLists;
        this.urlListView1 = urlListView;


        inflater = LayoutInflater.from(context);

如何从基本适配器的urlLists中的列表中删除项目?

2 个答案:

答案 0 :(得分:0)

删除项目:urlList.remove(item_index); 然后通知数据集已更改。

根据您的评论,我正在更新我的答案。
remove()方法接受要删除的元素的索引,而不是元素本身。

因此,要从列表中删除特定数字,首先应找到其索引,然后将该索引传递给remove()方法。

例如:

public void deleteItem(int numberToDelete) {
    int index=-1;

    // Find the index of numberToDelete
    if(urlLists.contains(numberToDelete)){
        index = urlLists.indexOf(numberToDelete);
    }

    // Delete the number by spefying the index found.
    if(index!=-1){
        urlLists.remove(index);
    }

//...
}

答案 1 :(得分:0)

除了覆盖public View getView(int position, View view, ViewGroup parent)之外,请确保扩展ArrayAdapter的类会覆盖这些方法:

public int getCount()
public UrlItem getItem(int position)
public int getPosition(Hold item)
public long getItemId(int position)

我相信notifyDataSetChanged()会调用适配器上的getCount()来确定有多少项。如果您不使用return urlItems1.size();覆盖此方法,那么IndexOutOfBoundException似乎迫在眉睫,因为您的自定义适配器无法告诉客户其大小和内容。