我有一个用于管理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(...));

10-07 20:53
查看更多