【问题标题】:Custom ArrayAdapter shows duplicate images after scrolling自定义 ArrayAdapter 滚动后显示重复图像
【发布时间】:2014-11-01 00:29:07
【问题描述】:

我是 android 新手,通过使用 ArrayAdapter,我正在尝试创建一个带有标题和图像的 listView。我从 sqlite 数据库中获取图像。(我知道,不推荐),但到目前为止我能够创建所需的 listView。

listView 中有一些项目没有图像,有些项目有图像,我遇到的问题是当我向上和向下滚动时,我的图像被复制了。没有图像的从列表中获取随机图像。

我已经搜索了网络并找到了相关主题,但这并没有解决我的问题。

我的 ArrayAdapter 代码:

public class CustomListViewAdapter extends ArrayAdapter<DataItems> 
{
  Context context;
  LayoutInflater mInflater;

  public CustomListViewAdapter(Context context, int resourceId, List<DataItems> items) 
  {
    super(context, resourceId, items);
    this.context = context;
    mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
  }

  /* private view holder class */
  private class ViewHolder 
  {
     ImageView thumdnail;           
     TextView txtTitle;
  } 

  public View getView(int position, View convertView, ViewGroup parent)
  {
    ViewHolder holder = null;
    DataItems rowItem = getItem(position);

    if (convertView == null) 
    {
      holder = new ViewHolder();

      convertView = mInflater.inflate(R.layout.list_item2, null, false);

      holder.thumdnail = (ImageView) convertView.findViewById(R.id.thumbnail2); 
      holder.txtTitle = (TextView) convertView.findViewById(R.id.mytitle2);

      convertView.setTag(holder);
    }
    else
    {
      holder = (ViewHolder) convertView.getTag();
    }


    holder.txtTitle.setText(rowItem.getTitle());

    if(rowItem.getThumbnailImageId() != null)
    {
      // here getImage() is converting byte array to bitmap

      Bitmap b2 = getImage(rowItem.getThumbnailImageId());
      Drawable drawable2 = new BitmapDrawable(b2);
      holder.thumdnail.setBackground(drawable2);
    }

    return convertView;

}

你能告诉我,我在这里做错了什么吗?

【问题讨论】:

标签: android android-listview android-arrayadapter


【解决方案1】:

感谢 njzk2,您的问题似乎是我们忘记在 if 语句中再次将 visibility 设置为 VISIBLE

如果没有图片,你需要指定geView 会做什么:

if(rowItem.getThumbnailImageId() != null)
        {
            // here getImage() is converting byte array to bitmap

            Bitmap b2 = getImage(rowItem.getThumbnailImageId());
            Drawable drawable2 = new BitmapDrawable(b2);
            holder.thumdnail.setBackground(drawable2);

            holder.thumdnail.setVisibility(View.VISIBLE);
        }
    else
    {
      //hide the image, or do anything you like when theres no image
      holder.thumdnail.setVisibility(View.GONE);
    }

重点在 else 代码中,因此listview 知道当有图像(您的 if 语句)和没有图像时(else 语句)该怎么做。

并尝试使您的持有人类静态:

private static class ViewHolder

【讨论】:

  • 我尝试过holder.thumdnail.setVisibility(View.GONE);,但它在滚动后隐藏了所有图像。
  • 我不知道这是否可行,尝试将您的持有人类设置为“静态”:“私有静态类 ViewHolder”。我在您的代码中没有发现任何错误。
  • @pro_newbie:是的,当然,因为在另一个子句中你没有设置可见性。
  • @njzk2 是的,这应该是问题
  • 感谢大家的帮助。
【解决方案2】:

如果你没有 thumbnailID,你应该隐藏 ImageView:

if(rowItem.getThumbnailImageId() != null)
    {
        holder.thumdnail.setVisibility(View.VISIBLE);

        Bitmap b2 = getImage(rowItem.getThumbnailImageId());
        Drawable drawable2 = new BitmapDrawable(b2);
        holder.thumdnail.setBackground(drawable2);
    }
else
{
     holder.thumdnail.setVisibility(View.GONE);
}

【讨论】:

  • 我已经试过了。当我向下和向上滚动时,列表视图只显示标题,所有图像都消失了。
  • 尝试调用 LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);只有一次。将 mInflater 声明为适配器的一个字段并在您的构造函数上初始化它,即在您的公共 CustomListViewAdapter(Context context, int resourceId, List items) 方法上。
  • @pro_newbie: 用那条实际的线holder.thumdnail.setVisibility(View.VISIBLE); ?
  • 不,您在每次调用 getView 方法时都在初始化 LayoutInflater。在我的所有适配器中,我只在构造函数中调用此方法一次。我真的不知道这是否会解决您的问题,但这肯定是一种更好的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
相关资源
最近更新 更多