0

我有一个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;
}

您可以看到,我使用 aViewHolder以获得更好的性能。在GetImg扩展 的类中Thread,我正在下载图像并将 设置BitmapImageView.

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

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

4

2 回答 2

0

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

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

笔记:

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

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

于 2013-03-05T00:46:40.680 回答
0

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

holder.imageView.setImageDrawable(//access your dataSet for images from here //);
于 2013-03-04T23:44:39.460 回答