0

我有一个ListView,它拥有有关歌曲的信息。另外,我想添加封面图片到ListViewListAdapter/convertView和新的线程来获取图像

因此我写了一个适配器。在此适配器最主要的是以下getView()方法:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final Map dataSet = mData.get(position); 
    View v = convertView; 
    ViewHolder holder; 
    if (convertView == null) { 
     v = mInflater.inflate(mResource, parent, false); 
     holder = new ViewHolder(); 
     holder.artist = (TextView) v.findViewById(R.id.artist); 
     holder.imageView = (ImageView) v.findViewById(R.id.imageListView); 
     holder.title = (ScrollingTextView) v.findViewById(R.id.title); 
     holder.time = (TextView) v.findViewById(R.id.time); 
     v.setTag(holder); 
    } else { 
     holder = (ViewHolder) v.getTag(); 
    } 
    holder.artist.setText((CharSequence) dataSet.get("artist")); 
    holder.title.setText((CharSequence) dataSet.get("title")); 
    holder.time.setText((CharSequence) dataSet.get("time")); 

    GetImg gi = new GetImg(v, mContext); 
    gi.start(); 

    return v; 
} 

你可以看到,我使用一个ViewHolder有更好的表现。在延伸ThreadGetImg类中,我下载图像并将Bitmap设置为ImageView

现在我收到以下问题。有时候,ListView中的多个子视图会获得相同的图像。为什么?

当我不使用convertView时,一切正常,但速度不及convertView

回答

0

我认为你不应该创建新的线程下载getView()内的图像。通过这种方式管理线程非常困难。相反,你可以试试这些:

例如,当用户滚动到新项目时,查询图像。在内容提供商中,如果图像是新的,则创建新线程以下载它们。完成后,您将进行“假”插入,以使加载程序重新加载数据并将图像分配给视图。

注:

  • 确保正确管理线程。将有数百个项目,并且您可以在用户滚动列表时创建太多线程。
  • 考虑使用ListView的“慢适配器”。您可以在查看示例[Android-SDK] /samples/android-xxx/ApiDemos/src/com/example/android/apis/view/List13.java(或在模拟器中,打开应用程序API演示视图> Lists> 13. Slow Adapter)。

要查看完整的例子(只是一个应用程序没有源代码),你可以尝试this one。我正在使用上面的技术和一个“慢适配器”来显示图像和视频的缩略图。

0

您只能为您的数据集中的艺术家,标题和时间设置不同的值。对于你的图像视图,你将不得不与持有人一样。假设您的ListView中的每个视图都具有唯一图像的数据集,则还需要为ImageView添加setImageDrawable方法。就像:

holder.imageView.setImageDrawable(//access your dataSet for images from here //); 
+0

GetImg类的一个参数是视图v。我从GetImg类的视图v中获取ImageView,并在该类中设置位图。 – svennergr 2013-03-04 23:48:58

+0

而且我甚至没有URL,也没有数据集中的位图。 – svennergr 2013-03-04 23:56:47

+0

您可以将各个项目的特定图像保存为可绘制。在DB /共享首选项中保留歌曲 - >图像的映射。然后在Arraylist中填充ListView并在上面的行中访问包含imageNames的arrayList时提取此信息。我也在我的应用程序中完成了这项工作。 – 2013-03-05 00:03:23