【问题标题】:Android Custom Cursor AdapterAndroid 自定义光标适配器
【发布时间】:2012-06-28 10:08:31
【问题描述】:

我为联系人应用创建了一个应用。我的自定义光标适配器有一个问题,每次我上下滚动时都有两个文本视图和图像视图,图像在另一个列表项上重复。任何人都可以帮助我解决这个问题。提前致谢。

这是代码

@Override
public void bindView(View view, Context context, Cursor cursor) {
    if(view !=null){

        ViewHolder holder = initViewHolder(view);

        holder.displayName.setText(getUserDisplayName(cursor.getString(userid)));
        holder.groupId.setText(cursor.getString(group));

                holder.displayPhoto.setImageURI(imageUri);

    }

}

private ViewHolder initViewHolder(View view) {
    ViewHolder innerViewHolder = null;
    if(innerViewHolder == null){
        innerViewHolder = new ViewHolder();
        innerViewHolder.displayName  =(TextView) view.findViewById(R.id.name);
        innerViewHolder.groupId = (TextView) view.findViewById(R.id.groupId);
        innerViewHolder.displayPhoto = (ImageView) view.findViewById(R.id.photo);
    }
    return innerViewHolder;
}


class ViewHolder{
    TextView displayName;
    TextView groupId;
    ImageView displayPhoto;
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return inflater.inflate(R.layout.contact_list_item, null);
}

【问题讨论】:

  • 发布自定义光标适配器的代码。
  • 这和你的问题无关,但是写ViewHolder innerViewHolder = null;然后if(innerViewHolder == null)是多余的
  • 看起来 imageUri 没有针对单个视图进行更改,可能需要检查您是否只是为每一行加载相同的 uri。
  • 这是关于图像映射的东西。我将图像直接映射到 SD 卡?

标签: android android-cursoradapter


【解决方案1】:

这是 newView() 和 bindView() 的示例实现。

public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View view = inflater.inflate(R.layout.list_item_whatever, null);
    ViewHolder holder = new ViewHolder();
    holder.displayName = (TextView) view.findViewById(R.id.name);
    holder.groupId = (TextView) view.findViewById(R.id.groupId);
    holder.displayPhoto = (ImageView) view.findViewById(R.id.photo);
    view.setTag(holder);
    return view;
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    ViewHolder holder = (ViewHolder) view.getTag();
    if (holder.displayName != null) {
        holder.displayName.setText(getUserDisplayName(cursor.getString(userid)));
    }
    if (holder.groupId != null) {
        holder.groupId.setText(cursor.getString(group));
    }
    if (holder.displayPhoto != null) {
        holder.displayPhoto.setImageURI(imageUri);
    }
}

此外,对于 imageUri,您可能也想从光标中获取它...
目前,您对所有列表项使用相同的 URI

【讨论】:

  • 谢谢我解决了这个问题。这是一个简单的解决方案。您必须将空 ImageView 设置为任何默认图像。这样每次您上下滚动时,其他图像都不会在另一行重复。我认为这是因为它在 ui 部分缓存图像的图像,以便它在行上重复 if (holder.displayPhoto != null) { holder.displayPhoto.setImageURI(imageUri); }else{holder.displayPhoto.setImageURI();}
  • 没错,那是因为 ListView 重用了它的视图来优化性能
  • 所以它不能在 ImageView 上设置 null 或空值。谢谢
猜你喜欢
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
相关资源
最近更新 更多