Android 自定义ArrayAdapter在滚动后显示重复图像

Android 自定义ArrayAdapter在滚动后显示重复图像,android,android-listview,android-arrayadapter,Android,Android Listview,Android Arrayadapter,我是android新手,通过使用ArrayAdapter,我试图创建一个带有标题和图像的列表视图。我正在从sqlite数据库获取图像(我知道,不推荐这样做),但到目前为止,我能够创建所需的listView listView中有些项目没有图像,有些项目有图像,我遇到的问题是,当我上下滚动时,图像会被复制。没有图像的从列表中获取随机图像 我在网上搜索并找到了相关的线索,但这并没有解决我的问题 我的ArrayAdapter代码: public class CustomListViewAdapter e

我是android新手,通过使用ArrayAdapter,我试图创建一个带有标题和图像的列表视图。我正在从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;

}
公共类CustomListViewAdapter扩展了ArrayAdapter
{
语境;
拉平机;
公共CustomListViewAdapter(上下文上下文、int resourceId、列表项)
{
超级(上下文、资源ID、项目);
this.context=上下文;
mInflater=(LayoutInflater)context.getSystemService(Activity.LAYOUT\u INFLATER\u SERVICE);
}
/*私有视图持有者类*/
私有类视窗持有者
{
ImageView thumdnail;
TextView-txtTitle;
} 
公共视图getView(int位置、视图转换视图、视图组父视图)
{
ViewHolder=null;
DataItems rowItem=getItem(位置);
if(convertView==null)
{
holder=新的ViewHolder();
convertView=mInflater.inflate(R.layout.list_item2,null,false);
holder.thumdnail=(ImageView)convertView.findViewById(R.id.thumdnail2);
holder.txtTitle=(TextView)convertView.findViewById(R.id.mytitle2);
convertView.setTag(支架);
}
其他的
{
holder=(ViewHolder)convertView.getTag();
}
holder.txtitle.setText(rowItem.getTitle());
if(rowItem.getThumbnailImageId()!=null)
{
//这里getImage()正在将字节数组转换为位图
位图b2=getImage(rowItem.getThumbnailImageId());
Drawable Drawable 2=新的位图Drawable(b2);
刀架.手钉.立根台(可拉拔2);
}
返回视图;
}

您能告诉我,我做错了什么吗?

多亏了njzk2您的问题似乎是我们忘了在if语句中再次将
可见性设置为
可见

如果没有图像,您需要指定
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语句)时该怎么做

并尝试将holder类设置为静态:

private static class ViewHolder

多亏了njzk2,您的问题似乎是我们忘了在if语句中再次将
可见性设置为
可见

如果没有图像,您需要指定
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语句)时该怎么做

并尝试将holder类设置为静态:

private static class ViewHolder

如果没有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);
}

如果没有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);
}


提示:当
rowItem.getThumbnailImageId()==null时会发生什么?您应该实现else的可能副本…提示:当
rowItem.getThumbnailImageId()时会发生什么==null
?您应该实现其他可能的副本…我已经尝试过了。当我向下滚动并备份时,listview只显示标题,所有图像都消失了。尝试调用LayoutFlater mInflater=(LayoutFlater)context.getSystemService(Activity.LAYOUT\u INFLATER\u SERVICE);仅一次。将mInflater声明为适配器的字段,并在构造函数上对其进行初始化,即在公共CustomListViewAdapter(上下文上下文,int resourceId,List items)方法上进行初始化。@pro_新手:使用实际行
holder.thumdnail.setVisibility(View.VISIBLE);
?不,每次调用getView方法时,您都会初始化LayoutInflater。在我所有的适配器中,我只在构造函数中调用此方法一次。我真的不知道这是否能解决您的问题,但这肯定是一个更好的做法。我已经尝试过了。当我向下滚动并备份时,listview只显示标题,所有内容都不会显示图像已消失。请尝试调用LayoutInflater mInflater=(LayoutInflater)context.getSystemService(Activity.LAYOUT\u INFLATER\u SERVICE);仅一次。将mInflater声明为适配器的一个字段,并在构造函数上初始化它,即在公共CustomListViewAdapter上初始化它(上下文上下文,int resourceId,列表项)方法。@pro_新手:使用实际行
holder.thumdnail.setVisibility(View.VISIBLE);
?不,每次调用getView方法时,您都在初始化LayoutInflater。在我所有的适配器中,我只在构造函数中调用此方法一次。我真的不知道这是否能解决您的问题,但这肯定是一种更好的做法。我已经尝试过使用
holder.thumdnail.setVisibility(View.GONE);
但它会在滚动后隐藏所有图像。我不知道这是否有效,请尝试将holder类设置为“static”:“private static class ViewHolder”。我看不出你的代码有任何错误。@pro_新手:是的,当然,因为在另一个子句中,你没有设置可见性。@njzk2是的,这应该是问题所在。谢谢大家的帮助。我已经尝试过执行
holder.thumdnail.setVisibility(View.GONE);
但它会在滚动后隐藏所有图像。我不知道这是否有效,请尝试将holder类设置为“static”:“private static class ViewHolder”.我看不出你的代码有任何错误。@pro_新手:是的,当然,因为在另一个子句中你没有设置可见性。@njzk2是的,这应该是问题所在。谢谢大家的帮助。