ListAdapter / convertView和新线程来获取图像

时间:2013-03-04 23:27:53

标签: android android-listview android-imageview android-image android-adapter

我有ListView,其中包含有关歌曲的信息。另外,我想在ListView添加封面图片。

因此我写了一个适配器。此适配器中的主要内容是以下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的{​​{1}}课程中,我正在下载图片并将Thread设置为Bitmap

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

当我不使用ListView时,一切正常,但不如convertView快。

2 个答案:

答案 0 :(得分:0)

您只是为数据集中的艺术家,标题和时间设置不同的值。对于你的图像视图,你必须与持有人做同样的事情。假设您的ListView中的每个视图都有一个包含唯一图像的dataSet,您还需要为ImageView添加 setImageDrawable 方法。类似的东西:

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

答案 1 :(得分:0)

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

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

注意:

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

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