【问题标题】:ListAdapter / convertView and new thread to get imagesListAdapter / convertView 和获取图像的新线程
【发布时间】:2013-03-04 23:27:52
【问题描述】:

我有一个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 以获得更好的性能。在扩展ThreadGetImg 类中,我正在下载图像并将Bitmap 设置为ImageView

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    注意事项:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • GetImg类的一个参数是View v,我在GetImg类中从view v中获取ImageView,在这个类中设置Bitmap。
      • 我什至没有 URL,数据集中的位图也没有。
      • 您可以将单个项目的特定图像保存在drawable中。在 DB / Shared 首选项中保留歌曲 -> 图像的映射。然后在 Arraylist 中填充 ListView 时提取此信息,并访问包含上述行中的 imageNames 的 arrayList。我在我的应用程序中也这样做了。
      猜你喜欢
      • 1970-01-01
      • 2015-08-15
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多