内容更新时,具有自定义适配器的ListView不会更新

时间:2011-11-03 13:25:01

标签: android android-listview listadapter

我有一个名为AreasListView的自定义ListView,我已将其包含在XML文件中。区别于ListView的唯一因素是以下代码行:

private void setFooter(){
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View footer = inflater.inflate(R.layout.areas_list_add_item, null);
    addFooterView(footer);
}

@Override
public void setAdapter(ListAdapter adapter)
{
    super.setAdapter(adapter);
}

页脚本身在构造函数中添加了页脚。

在此列表中,我将在onCreate方法中设置自定义适配器。稍后(当用户单击自定义列表视图所具有的页脚时)将启动另一个活动以获取结果。当那个返回时,一个新项被添加到位于自定义适配器下的ArrayList。

这是适配器代码:

public class AreasAdapter extends BaseAdapter

{

private Manager manager;

public AreasAdapter(Manager mgr){
    this.manager = mgr;
}

@Override
public int getCount()
{
    return manager.getAreas().size();
}

@Override
public Object getItem(int arg0)
{
    return manager.getAreas().get(arg0);
}

public Area getArea(int index){
    return manager.getAreas().get(index);
}

@Override
public long getItemId(int arg0)
{
    return arg0;
}

@Override
public int getItemViewType(int arg0)
{
    return Adapter.IGNORE_ITEM_VIEW_TYPE;
}

@Override
public View getView(int arg0, View arg1, ViewGroup arg2)
{
    AreasListItem viewToReturn = null;
    if (arg1 != null){
        viewToReturn = (AreasListItem)arg1;
    } else {
        LayoutInflater inflater = (LayoutInflater) arg2.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        viewToReturn = (AreasListItem)inflater.inflate(R.layout.areas_list_item, null);
    }
    viewToReturn.setArea(manager.getAreas().get(arg0));
    return viewToReturn;
}

@Override
public int getViewTypeCount()
{
    return 1;
}

@Override
public boolean hasStableIds()
{
    return false;
}

@Override
public boolean isEmpty()
{
    return (manager.getAreas().size() == 0);
}

@Override
public void registerDataSetObserver(DataSetObserver arg0)
{
    super.registerDataSetObserver(arg0);
}

@Override
public void unregisterDataSetObserver(DataSetObserver observer)
{
          super.unregisterDataSetObserver(observer);

}

@Override
public boolean areAllItemsEnabled()
{
    return true;
}

@Override
public boolean isEnabled(int position)
{
    return true;
}

}

收到结果后,我尝试调用notifyDataSetChanged,但它不起作用。代码:

    if (resultCode == Activity.RESULT_OK){
            Area resultArea = (Area) returnIntent.getExtras().get(ActivityAreaAdd.EXTRA_AREA);
                service.getManager().addArea(resultArea);
//              TODO figure out how to update the list with the newly added areas
                ((AreasAdapter)(((HeaderViewListAdapter) list.getAdapter()).getWrappedAdapter())).notifyDataSetChanged();
        }

我做错了什么?到目前为止,我已尝试过以下内容:

  • 更改AreasListView,以便我没有获得HeaderListViewAdapter并尝试调用notifyDataSetChanged();
  • call list.invalidate();
  • call list.invalidateViews();
  • call list.requestLayout();

更新: 我尝试使用@Jack的解决方案,但它不起作用。这是我做的: 来自我的onActivityResult:

    if (resultCode == Activity.RESULT_OK){
            Area resultArea = (Area) returnIntent.getExtras().get(ActivityAreaAdd.EXTRA_AREA);
//              TODO figure out how to update the list with the newly added areas
                ((AreasAdapter)(((HeaderViewListAdapter) list.getAdapter()).getWrappedAdapter())).addArea(resultArea);
            }

以及AreasAdapter的相应代码:

public void addArea(Area a){
    manager.addArea(a);
    notifyDataSetChanged();
}

4 个答案:

答案 0 :(得分:1)

我解决了这个问题。显然,我需要从自定义列表中删除@Override setAdapter方法。

这很奇怪,因为它包含的是对super.setAdapter(适配器)的调用。

答案 1 :(得分:0)

尝试致电:

list.invalidate();

答案 2 :(得分:0)

请参阅this回答,因为我认为它会指出正确的方向。他基本上说:

  

对于ArrayAdapter,notifyDataSetChanged仅在您使用时才有效   添加,插入,删除和清除适配器上的功能。

编辑:另请参阅this代码段。他们将notifyDataSetChanged()调用添加到适配器:

       public void clearPhotos() {
            mPhotos.clear();
            notifyDataSetChanged();
        }

        public void addPhotos() {
            int whichPhoto = (int)Math.round(Math.random() * (mPhotoPool.length - 1));
            int newPhoto = mPhotoPool[whichPhoto];
            mPhotos.add(newPhoto);
            notifyDataSetChanged();
        }

答案 3 :(得分:0)

尝试list.requestLayout()它帮助我使用TextView和文档

  

“当某些内容发生变化而导致此视图布局失效时调用此方法”