android notifyDataSetChanged不起作用

时间:2014-02-26 09:16:49

标签: android listview android-listview

我将onCreate()中的适配器绑定到ListView,每次活动在onResume()时,我都会更新适配器中的appinfos数据,并在适配器setdata()方法中调用notifyDataSetChanged。但即使我的适配器中更改了数据,我也不会刷新ListView。我无法弄清楚问题是什么,你能帮帮我吗?感谢

以下是我使用适配器并将数据设置为listview的活动。

List<AppInfo> appinfos = new ArrayList<AppInfo>();
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getAppInfos();
    adapter=new UnistallListAdapter(this,appinfos);
    applistView.setAdapter(adapter);
}

@Override
protected void onResume() {
    getAppInfos();
    adapter.setdata(appinfos);
    super.onResume();
}


private List<AppInfo> getAppInfos() {
    appinfos.clear();
            //do some thing, new an item; and add into appinfos object
            //the appinfos data often changed here, 
            // as I uninstall app before activity called onResume().
           ......       
          appinfos.add(info);
            .....
    return appinfos;
}

以下是我的UnistallListAdapter的主要代码,以及如何更改其数据。

private List<AppInfo>infos;
    public UnistallListAdapter(Context c,List<AppInfo>info)
{
    mContext = c;
    inflate=LayoutInflater.from(c);
    infos=info;
}

   @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return infos.get(position);
    }

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return infos.size();
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    ViewHold holder = null;
    if(convertView==null)
    {
        convertView=inflate.inflate(R.layout.uninstall_item, null);
        holder=new ViewHold();
        holder.name=(TextView)convertView.findViewById(R.id.name);
        holder.icon=(ImageView)convertView.findViewById(R.id.icon);

        holder.ai = infos.get(position);;
        convertView.setTag(holder);
    }
    else
    {
        holder=(ViewHold)convertView.getTag();
    }

    AppInfo ai = holder.ai;
    holder.name.setText(ai.mAppLabel);
    holder.icon.setImageDrawable(ai.mIcon);

    return convertView;
}

private class ViewHold
{
    AppInfo ai;
    ImageView icon;
    TextView name;
}
public void setdata(List<AppInfo> dataList) {
    infos = dataList;
    notifyDataSetChanged();
}

请给我一些帮助,欢迎任何关于理由的提示。我非常感谢你的帮助。

4 个答案:

答案 0 :(得分:4)

改变这个:

public void setdata(List<AppInfo> dataList) {
  infos = dataList;
  notifyDataSetChanged();
}

public void setdata(List<AppInfo> dataList) {
  infos.clear();
  infos.putAll(dataList);
  notifyDataSetChanged();
}

重置列表中包含的数据而不是其参考。

答案 1 :(得分:4)

holder.ai = infos.get(position);

您正在视图持有者中存储对象引用,并且永远不会更新它。

视图持有者不应该包含对数据对象的引用,只包含对视图的引用。使用getItem(position)每次都可以在getView()

中获取最新的数据对象

答案 2 :(得分:0)

在onResume方法中,您正在调用getAppInfos();.但是,您没有将它分配给您的ArrayList appinfos。因此它没有得到更新并将相同的列表传递给setdata()方法。

DO,

this.appinfos = getAppInfos();
adapter.setdata(appinfos);
super.onResume();

OR

adapter.setdata(getAppInfos());
super.onResume();

答案 3 :(得分:0)

添加applistView.setAdapter(适配器);在适配器.setdata(appinfos);

之后的onResume中