gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:10:05 25 4
gpt4 key购买 nike

我有一个名为 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 方法中设置了一个自定义适配器。稍后(当用户单击自定义 ListView 具有的页脚时)将启动另一个 Activity 以获取结果。当它返回时,一个新项目被添加到位于自定义适配器下的 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();
  • 调用 list.invalidate();
  • 调用 list.invalidateViews();
  • 调用list.requestLayout();

更新:我尝试使用@Jack 的解决方案但它不起作用。这是我所做的:来 self 的 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();
}

最佳答案

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

这很奇怪,因为它只包含对 super.setAdapter(adapter) 的调用。

关于android - 内容更新时,带有自定义适配器的 ListView 不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7995647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com