使用自定义适配器更新列表视图

update a listview with custom adapter

我正在使用自定义数组适配器将数据添加到自定义列表视图 请告诉我如何更新此列表视图和适配器 当我第一次使用 add()notifyDataSetChanged() 将项目添加到我的列表视图数组适配器时它工作正常但第二次我做同样的但是它给了我错误我在某处读到我必须添加一个方法到我的适配器来处理这个像 addMoreItem 之类的 这是我的适配器

public class StringArrayAdapter extends ArrayAdapter<ContentSetter> {
ArrayList<ContentSetter> postList;
private int mCount = 20;
LayoutInflater myInflater;
int Resource;
ViewHolder holder;

public StringArrayAdapter(Context c , int resource  , ArrayList<ContentSetter> obj) {
    super(c , resource ,obj);
    myInflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    Resource = resource;
    postList = obj;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        holder = new ViewHolder();
        v = myInflater.inflate(Resource, null);
        holder.name = (TextView) v.findViewById(R.id.mahdi);
    } else {
        holder = (ViewHolder)v.getTag();
    }
    holder.name.setText(postList.get(position).getPostId());
    return v;
}
static class ViewHolder{
    public TextView name;
}

}

根据您发布的代码:

第一个:

请确保 ArrayList<ContentSetter> obj 不为空。 super class 不检查空值。

第二个:这里

if (v == null) {
    holder = new ViewHolder();
    v = myInflater.inflate(Resource, null);
    holder.name = (TextView) v.findViewById(R.id.mahdi);
} else {
    holder = (ViewHolder)v.getTag();
}

您需要在 if 条件下调用 v.setTag(holder),在您初始化 holder 之后。

if (v == null) {
    holder = new ViewHolder();
    v = myInflater.inflate(Resource, null);
    holder.name = (TextView) v.findViewById(R.id.mahdi);
    v.setTag(holder);
}

第三个

如果 getPostId() 是 returning 一个 int,您应该将 return 值环绕在 String.valueOf 周围。 setText 的重载方法采用 int 尝试查找本地化字符串,如果找不到匹配则抛出异常