Android 自定义Listview在AsyncTask中不显示任何内容

Android 自定义Listview在AsyncTask中不显示任何内容,android,listview,android-asynctask,Android,Listview,Android Asynctask,我正在使用代码将照片列表从图库加载到自定义水平列表视图中。Listview滚动不平稳。我决定把正在加载的照片放在背景中。但是现在listview什么也不显示。你能帮我一下吗?经过一番讨论,我做了一些更正。但是结果显示空的listview Main.java public class Main extends Activity { private HorizontalImageAdapter horizontalimageAdapter; private HorizontalListVi

我正在使用代码将照片列表从图库加载到自定义水平列表视图中。Listview滚动不平稳。我决定把正在加载的照片放在背景中。但是现在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);
     }
    }
public类主扩展活动{
私有HorizontalImageAdapter HorizontalImageAdapter;
私有水平视图列表视图;
私人公用事业;
私有ArrayList ImagePath=新ArrayList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\水平\列表\视图);
utils=新的Utilf(本);
ImagePath=utils.getFilePath();
listview=(HorizontalListView)findViewById(R.id.gallery);
horizontalimageAdapter=新的horizontalimageAdapter(这是ImagePath);
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;
 }
}
公共类HorizontalImageAdapter扩展了BaseAdapter{
私人活动语境;
私有静态图像视图;
私人ArrayList绘图;
私人充气机;
公共水平图像适配器(活动上下文、ArrayList绘图页){
this.context=上下文;
this.plotsImages=plotsImages;
l_Inflater=从(上下文)开始的布局更平坦;
}
@凌驾
public int getCount(){
返回plotsImages.size();
}
@凌驾
公共对象getItem(int位置){
返回null;
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=l\u充气机。充气(R.layout.listview\u项,空);
holder=新的ViewHolder();
holder.imageView=(imageView)convertView.findViewById(R.id.icon);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
if(holder.imageView!=null){
新建ImageDownloaderTask(holder.imageView).execute(plotsImages.get(position));
}
返回视图;
}
私有静态类视图持有者{
图像视图图像视图;
}
}
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));
                    }
                }

            }
        }
class ImageDownloaderTask扩展异步任务{
私有最终WeakReference imageViewReference;
私有int imageWidth=96;
公共图像下载任务(图像视图图像视图){
imageViewReference=新的WeakReference(imageView);
}
@凌驾
受保护位图doInBackground(字符串…参数){
位图位图=加载位图(参数[0]);
返回位图;
}
@凌驾
受保护的void onPostExecute(位图){
如果(isCancelled()){
位图=空;
}
if(imageViewReference!=null){
ImageView=imageViewReference.get();
如果(imageView!=null){
if(位图!=null){
设置图像位图(位图);
}否则{
//setImageView.setImageDrawable(imageView.getContext().getResources().getDrawable(R.drawable.list_占位符));
}
}
}
}
  • 列表项

    请检查您的
    getItem(int position)
    方法。它返回null。相反,您必须从该位置本身的列表中返回对象

  • getView()方法

您将直接返回convertView,而是将其放入一个单独的变量中,如下面的代码所示

 public View getView(int position, View convertView, ViewGroup parent) {
    View rowView = convertView;
    // reuse views
    if (rowView == null) {
      LayoutInflater inflater = context.getLayoutInflater();
      rowView = inflater.inflate(R.layout.rowlayout, null);
      // configure view holder
      ViewHolder viewHolder = new ViewHolder();
      viewHolder.text = (TextView) rowView.findViewById(R.id.TextView01);
      viewHolder.image = (ImageView) rowView
          .findViewById(R.id.ImageView01);
      rowView.setTag(viewHolder);
    }

    // fill data
    ViewHolder holder = (ViewHolder) rowView.getTag();
    String s = names[position];
    holder.text.setText(s);
    if (s.startsWith("Windows7") || s.startsWith("iPhone")
        || s.startsWith("Solaris")) {
      holder.image.setImageResource(R.drawable.no);
    } else {
      holder.image.setImageResource(R.drawable.ok);
    }

    return rowView;
  }

从链接获取的代码不能这样做,因为您的imageview将被重复使用多次。 您需要一种方法来检查asynctask加载完位图后,您是否仍在listview的同一行,否则在滚动listview时,您将在随机位置显示图像。为此,您可以将位图url存储为imageview上的标记,并在调用setImageBitmap()之前检查该标记。如果匹配,则可以显示位图,否则不执行任何操作


但是就像@HERO说的,你为什么不使用毕加索库,这样做会更好;)

onPostExecute
这行
listview.setAdapter(mAdapter)中发布你的
loadBitmap(…)
methodset adapter
必须在
onPostExecute
没有冒犯的意思,但是为什么你要尝试重新发明轮子?像UIL()和毕加索()这样的库被创建来帮助你完成你的工作。@SweetWisherツ, 我想他已经在listview中设置了适配器。Async用于将图像加载到适配器内部的viewholder中。在我看来,这就是它的样子。我需要水平listview。然后你需要使用ViewPager,而不是listview。但是,如果你在正确的imageview中显示图像,则从Async任务加载图像的代码只能随机工作(参考我的回答)ViewPager不适用于我,因为我需要gallery之类的小部件。Imageview不为null,因此它调用异步加载。我需要重新加载适配器吗?但如何进行?是的,但如果用户正在滚动,Imageview很可能已被回收,您将无法在需要的位置显示图像。如果要实现gall,则需要使用ViewPagerery。我不明白你关于重新加载适配器的问题。请阅读我的答案,其中解释了你在使用代码时将面临的问题。这没有帮助。我的代码在没有异步加载的情况下运行良好,平滑滚动除外。