我有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
快。
答案 0 :(得分:0)
您只是为数据集中的艺术家,标题和时间设置不同的值。对于你的图像视图,你必须与持有人做同样的事情。假设您的ListView中的每个视图都有一个包含唯一图像的dataSet,您还需要为ImageView添加 setImageDrawable 方法。类似的东西:
holder.imageView.setImageDrawable(//access your dataSet for images from here //);
答案 1 :(得分:0)
我认为您不应该创建新线程来下载getView()
内的图像。以这种方式管理线程非常困难。相反,你可以试试这些:
ListView
使用CursorAdapter
和LoaderManager
。例如,当用户滚动到新项目时,您将查询图像。在内容提供程序中,如果图像是新的,则创建新线程以下载它们。完成后,您进行“假”插入以让加载程序重新加载数据并将图像分配给视图。
注意:
ListView
使用“慢适配器”。您可以在 [Android-SDK] /samples/android-xxx/ApiDemos/src/com/example/android/apis/view/List13.java (或在模拟器中打开应用程序)查看示例 API演示>视图>列表> 13.慢速适配器)。要查看完整示例(只是一个没有源代码的应用),您可以尝试this one。我正在使用上述技术和“慢适配器”来显示图像和视频的缩略图。