我将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();
}
请给我一些帮助,欢迎任何关于理由的提示。我非常感谢你的帮助。
答案 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中