为了账号安全,请及时绑定邮箱和手机立即绑定

使用AsyncTask在ListView中加载图像

/ 猿问

使用AsyncTask在ListView中加载图像

烙印99 2019-10-18 14:46:38

我有一个可以容纳图像的ListView。这取决于SDCARD中是否存在图像。


这是我的示例代码:


public class MainActivity extends Activity  {


    ListView mListView;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        mListView = new ListView(this);

        setContentView(mListView);


        String[] arr = new String[] { 

                "/example/images/1.jpg", "/example/images/2.jpg",  

                "/example/images/3.jpg", "/example/images/4.jpg",  

                "/example/images/5.jpg", "/example/images/6.jpg", 

                "/example/images/7.jpg", "/example/images/8.jpg",  

                "/example/images/9.jpg", "/example/images/1.jpg", 

                "/example/images/2.jpg", "/example/images/3.jpg",  

                "/example/images/4.jpg", "/example/images/5.jpg",  

                "/example/images/6.jpg", "/example/images/7.jpg",  

                "/example/images/8.jpg", "/example/images/9.jpg", 

                "/example/images/1.jpg", "/example/images/2.jpg",  

                "/example/images/3.jpg", "/example/images/4.jpg",  

                "/example/images/5.jpg", "/example/images/6.jpg", 

                "/example/images/7.jpg", "/example/images/8.jpg",  

                "/example/images/9.jpg", "/example/images/1.jpg", 

                "/example/images/2.jpg", "/example/images/3.jpg",  

                "/example/images/4.jpg", "/example/images/5.jpg",  

                "/example/images/6.jpg", "/example/images/7.jpg",  

                "/example/images/8.jpg", "/example/images/9.jpg"}; 


        List<String> list = Arrays.asList(arr);


        MyAdapter adapter = new MyAdapter(this, R.layout.listitem_imv, list);


        mListView.setAdapter(adapter);

    }

查看完整描述

3 回答

?
慕斯王

您可以将ImageView发送到任务构造器,并在那里保留对图像路径的引用。现在,在onPostExecute上,检查ImageView的当前标记是否与开始时相同。如果是,则设置图像。如果否,则什么也不做。


但是,这意味着无论如何都将下载图像。您只是不会在视图上设置错误的图像。


编辑: 首先将ImageView传递给任务构造函数:


new LoadImage(imageView).execute()

然后在LoadImage构造函数中保存对ImageView和图像路径的引用。重要的是,将路径保存在构造函数中,而不是保存在doInBackground中,以确保我们不会遇到多线程问题。然后在onPostExecute处,检查当前路径。


class LoadImage extends AsyncTask<Object, Void, Bitmap>{


        private ImageView imv;

        private String path;


        public LoadImage(ImageView imv) {

             this.imv = imv;

             this.path = imv.getTag().toString();

        }


    @Override

    protected Bitmap doInBackground(Object... params) {

        Bitmap bitmap = null;

        File file = new File( 

                Environment.getExternalStorageDirectory().getAbsolutePath() + path);


        if(file.exists()){

            bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());

        }


        return bitmap;

    }

    @Override

    protected void onPostExecute(Bitmap result) {

        if (!imv.getTag().toString().equals(path)) {

               /* The path is not same. This means that this

                  image view is handled by some other async task. 

                  We don't do anything and return. */

               return;

        }


        if(result != null && imv != null){

            imv.setVisibility(View.VISIBLE);

            imv.setImageBitmap(result);

        }else{

            imv.setVisibility(View.GONE);

        }

    }


}


查看完整回答
反对 回复 2019-10-18
?
天天世纪

这篇Android开发者博客文章将为您提供完整的参考项目,其中包括缓存。只需将SD卡文件读取中的Http访问代码替换为即可。


查看完整回答
反对 回复 2019-10-18
?
泛舟湖上清波郎朗

我希望这有帮助。经过大量搜索,我有了这个可行的解决方案。


public class CustomAdapter extends ArrayAdapter<String>{

    /*

    public CustomAdapter(Context context , String[] video) {

        super(context,R.layout.custom_row, video);

    }

*/


private final Activity context;

private final String[] video;


static class ViewHolder {

    public TextView videoTitle;

    public ImageView videoThumbnail;

    public int position;

    public String path;

}


public CustomAdapter(Activity context, String[] video) {

    super(context, R.layout.custom_row, video);

    this.context = context;

    this.video = video;

}

@Override

public View getView(final int position, View convertView, ViewGroup parent) {


    LayoutInflater videoInflator = LayoutInflater.from(getContext());

    View customView = videoInflator.inflate(R.layout.custom_row, parent, false);

        ViewHolder viewHolder = new ViewHolder();

        viewHolder.position = position;

        viewHolder.path = video[position];

        viewHolder.videoTitle = (TextView) customView.findViewById(R.id.videoTitle);

        viewHolder.videoThumbnail = (ImageView) customView.findViewById(R.id.videoThumbnail);

        //rowView.setTag(viewHolder);

    //}

    customView.setTag(viewHolder);



    final String videoItem = video[position];

    int index=videoItem.lastIndexOf('/');

    String lastString=(videoItem.substring(index +1));

    index = lastString.indexOf(".mp4");

    lastString=(lastString.substring(0,index));

    viewHolder.videoTitle.setText(lastString);


    new AsyncTask<ViewHolder, Void, Bitmap>() {

        private ViewHolder v;


        @Override

        protected Bitmap doInBackground(ViewHolder... params) {

            v = params[0];

            Bitmap thumb = ThumbnailUtils.createVideoThumbnail(videoItem, MediaStore.Images.Thumbnails.MINI_KIND);

            return thumb;

        }


        @Override

        protected void onPostExecute(Bitmap result) {

            super.onPostExecute(result);

            if (v.position == position) {

                // If this item hasn't been recycled already, hide the

                // progress and set and show the image

                v.videoThumbnail.setImageBitmap(result);

            }

        }

    }.execute(viewHolder);

    return customView;

}

}


查看完整回答
反对 回复 2019-10-18

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信