Android ListAdapter/convertView和获取图像的新线程

Android ListAdapter/convertView和获取图像的新线程,android,android-listview,android-imageview,android-image,android-adapter,Android,Android Listview,Android Imageview,Android Image,Android Adapter,我有一个列表视图,其中包含有关歌曲的信息。另外,我想在列表视图中添加封面图像 因此,我编写了一个适配器。此适配器中的主要功能是以下getView()方法: @Override public View getView(int position, View convertView, ViewGroup parent) { final Map dataSet = mData.get(position); View v = convertView; ViewHolder hold

我有一个
列表视图
,其中包含有关歌曲的信息。另外,我想在
列表视图中添加封面图像

因此,我编写了一个适配器。此适配器中的主要功能是以下
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
。在扩展了
线程的
GetImg
类中,我正在下载图像并将
位图设置为
ImageView

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


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

时,您只需从数据集中设置艺术家、标题和时间的不同值。对于您的图像视图,您必须使用相同的支架。假设ListView中的每个视图都有一个具有唯一图像的数据集,那么还需要为ImageView添加setImageDrawable方法。比如:

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

我认为您不应该在
getView()
中创建新线程来下载图像。用这种方式管理线程是非常困难的。相反,您可以尝试以下方法:

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

注:

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

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

GetImg类的一个参数是View v。我从GetImg类中的view v中获取ImageView,并在该类中设置位图。我甚至没有URL,数据集中也没有位图。您可以在drawable中保存单个项目的特定图像。在DB/Shared首选项中保留歌曲->图像的映射。然后在Arraylist中填充ListView时提取此信息,并访问包含上述行中图像名称的Arraylist。我在我的申请表中也做过。