Android ListView与自定义适配器重复列表项

时间:2014-06-25 10:19:22

标签: android sqlite listview android-listview

我有一个listview,它使用自定义适配器从SQLite填充数据。我使用以下适配器。

public View getView(int pos, View child, ViewGroup parent) {
    CustomerHolder mHolder;
    LayoutInflater layoutInflater;


    if (null == child) {

        layoutInflater = (LayoutInflater) cContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        child = layoutInflater.inflate(R.layout.customer_info, null);
        mHolder = new CustomerHolder();
        mHolder.ccid = (TextView) child.findViewById(R.id.ccid);
        mHolder.ccode = (TextView) child.findViewById(R.id.ttv1);
        mHolder.cname = (TextView) child.findViewById(R.id.cname);
        mHolder.cspcode = (TextView) child.findViewById(R.id.cspcode);
        mHolder.ctype = (TextView) child.findViewById(R.id.ctype);

        child.setTag(mHolder);
    } 
    else 
    {
        mHolder = (CustomerHolder) child.getTag();

    }
    mHolder.ccid.setText(cid.get(pos));
    mHolder.ccode.setText(ccode.get(pos));
    mHolder.cname.setText(cname.get(pos));
    mHolder.cspcode.setText(cspcode.get(pos));
    mHolder.ctype.setText(ctype.get(pos));


    return child;

}

public class CustomerHolder {
    TextView ccid;
    TextView ccode;
    TextView cname;
    TextView cspcode;
    TextView ctype;
}

我面临的问题是,listview会填充数据,但每个列表项都是重复的。我在StackOverflow中经历了一些问题,但是,没有一个解决方案适合我。

2 个答案:

答案 0 :(得分:0)

我已经检查了我的适配器,只是与你的代码的不同之处在于我只实例化了一次LayoutInflater,而不是在每次getView调用时实例化,而我在创建时就是这样做。

private final LayoutInflater inflater;
(...)

public PropertyListAdapter(Context context) {
    super(context, 0, new ArrayList<PropertyListItem>());
    this.context = context;
    this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    (...)
}

第二件事是我的Holder类是静态的:

static class AdViewHolder {
    public AdView adView;
    public ProgressBar progressBar;
}

其他所有内容都与您的代码相同。相同的模式。因此,如果这些更改无效,请尝试检查您的对象/项目列表是否偶然包含相同的对象。

啊,第三件事 - 因为我的持有人是静态的:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    AdViewHolder adHolder = null;

    if (convertView == null) {
     (...)

}

我把它归零。

答案 1 :(得分:0)

那个适配器很好。您复制了数据库中的数据。