【发布时间】:2014-02-28 09:22:15
【问题描述】:
我正在使用代码将照片列表从图库加载到自定义水平列表视图中。 Listview 滚动不顺畅。我决定将加载照片放到背景中。但现在 listview 什么也没显示。你能给我任何帮助吗?经过一番讨论,我做了一些更正。但结果显示空列表视图。
Main.java
public class Main extends Activity {
private HorizontalImageAdapter horizontalimageAdapter;
private HorizontalListView listview;
private Utilf utils;
private ArrayList<String> imagePaths = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_horizontal_list_view);
utils = new Utilf(this);
imagePaths = utils.getFilePaths();
listview = (HorizontalListView) findViewById(R.id.gallery);
horizontalimageAdapter = new HorizontalImageAdapter(this, imagePaths);
listview.setAdapter(horizontalimageAdapter);
}
}
HorizontalImageAdapter.java
public class HorizontalImageAdapter extends BaseAdapter {
private Activity context;
private static ImageView imageView;
private ArrayList<String> plotsImages;
private LayoutInflater l_Inflater;
public HorizontalImageAdapter(Activity context, ArrayList<String> plotsImages) {
this.context = context;
this.plotsImages = plotsImages;
l_Inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return plotsImages.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = l_Inflater.inflate(R.layout.listview_item, null);
holder = new ViewHolder();
holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (holder.imageView != null) {
new ImageDownloaderTask(holder.imageView).execute(plotsImages.get(position));
}
return convertView;
}
private static class ViewHolder {
ImageView imageView;
}
}
ImageDownloader.java
class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
private int imageWidth = 96;
public ImageDownloaderTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap = loadBitmap(params[0]);
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (isCancelled()) {
bitmap = null;
}
if (imageViewReference != null) {
ImageView imageView = imageViewReference.get();
if (imageView != null) {
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
// imageView.setImageDrawable(imageView.getContext().getResources().getDrawable(R.drawable.list_placeholder));
}
}
}
}
【问题讨论】:
-
发布您的
loadBitmap(....)方法 -
在
onPostExecute中设置适配器 -
这一行
listview.setAdapter(mAdapter);必须在onPostExecute中 -
无意冒犯,但你为什么要重新发明轮子?创建 UIL (github.com/nostra13/Android-Universal-Image-Loader) 和 Picasso (github.com/square/picasso) 等库是为了帮助您准确地完成您的工作。
-
@SweetWisherツ,我认为他已经将适配器设置为列表视图。异步用于将图像加载到适配器内部的视图中。在我看来就是这样。
标签: android listview android-asynctask