我有一个用于管理ListView的自定义ArrayAdapter:
public class FilesAdapter extends ArrayAdapter<PutioFileLayout> {
Context context;
int layoutResourceId;
PutioFileLayout data[] = null;
public FilesAdapter(Context context, int layoutResourceId, PutioFileLayout[] data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
FileHolder holder = null;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new FileHolder();
holder.textName = (TextView) row.findViewById(R.id.text_fileName);
holder.textDescription = (TextView) row.findViewById(R.id.text_fileDesc);
holder.imgIcon = (ImageView) row.findViewById(R.id.img_fileIcon);
row.setTag(holder);
} else {
holder = (FileHolder) row.getTag();
}
PutioFileLayout file = data[position];
holder.textName.setText(file.name);
holder.textDescription.setText(file.description);
holder.imgIcon.setImageResource(file.icon);
return row;
}
static class FileHolder {
TextView textName;
TextView textDescription;
ImageView imgIcon;
}
}
在片段中,我在
onCreate
之前声明它们:private PutioFileLayout[] fileData;
private FilesAdapter adapter;
然后,在
onCreate
中,以此初始化它,作为用户的占位符: fileData = new PutioFileLayout[] {
new PutioFileLayout("Loading...", "Your files will appear shortly.", R.drawable.ic_launcher, false)
};
然后初始化适配器:
adapter = new FilesAdapter(getSherlockActivity(), R.layout.file,
fileData);
listview.setAdapter(adapter);
稍后,经过一些网络工作之后,我更新了适配器的数据。这是我认为可能会出错的地方。
PutioFileLayout[] files = blah blah, stuff. I've confirmed in debug that this array is correct and has the correct number of values.
adapter.data = files;
adapter.notifyDataSetChanged();
所有这些的结果就是ListView显示了数组中的第一项,而没有其他内容。
如果在初始化时添加第二个Loading ...行或类似内容,它将显示前两个。 Etcetera。
我想念什么吗?正确的方法是什么?
最佳答案
如果要更新ArrayAdapter
,请使用ArrayList
而不是Array
。因为如果使用Array
,则ArrayAdapter
将在内部使用List
,而无法更新。
重写您的构造函数
public FilesAdapter(Context context, int layoutResourceId, List<PutioFileLayout> list) {
super(context, layoutResourceId, list);
...
}
在
getView()
中,您可以通过调用getItem(position)
获得项目。要初始化适配器,请使用
adapter = new FilesAdapter(getSherlockActivity(), R.layout.file, new ArrayList<PutioFileLayout>());
要填充适配器,请使用
adapter.add(new PutioFileLayout(...));