Android自定义Listview图像加载(不带库)

Android自定义Listview图像加载(不带库),android,listview,android-asynctask,image-loading,Android,Listview,Android Asynctask,Image Loading,我想将sd卡中的图像加载到自定义列表视图中。我的列表视图包含图像视图和文本视图。我知道有很多库可以帮助我实现这一点,但我不想使用这些库。 问题:- 我正在从异步任务加载图像。我正在从getView()内部调用异步任务。 我只得到最后一行的图像。也就是说,如果“我的文件夹”中有3个图像,则在listview的第3项中仅显示该图像 下面是我的代码:- public class MyPhotoAdapter extends BaseAdapter { private Activity cal

我想将sd卡中的图像加载到自定义列表视图中。我的列表视图包含图像视图和文本视图。我知道有很多库可以帮助我实现这一点,但我不想使用这些库。

问题:-

我正在从异步任务加载图像。我正在从getView()内部调用异步任务。 我只得到最后一行的图像。也就是说,如果“我的文件夹”中有3个图像,则在listview的第3项中仅显示该图像

下面是我的代码:-

public class MyPhotoAdapter extends BaseAdapter {

    private Activity callingActivity;
    private ArrayList<String> filePaths = new ArrayList<String>();//contains file path of images
    ArrayList<Bitmap> myImages = new ArrayList<Bitmap>();
    private int imageWidth;
    int position;

    ImageView iv_photo;
    TextView tv_address;


    public MyPhotoAdapter(Activity activity,ArrayList<String> paths,int width)
    {
        this.callingActivity = activity;
        this.filePaths = paths;
        this.imageWidth = width;
    }



    @Override
    public int getCount() {
        return filePaths.size();
    }

    @Override
    public Object getItem(int i) {
        return this.filePaths.get(i);
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {

        position = i;

        LayoutInflater inflater = (LayoutInflater) callingActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.single_photo,viewGroup, false);

        iv_photo = (ImageView) row.findViewById(R.id.photoView);
        tv_address = (TextView) row.findViewById(R.id.tv_address);

        AsyncImageLoader loader = new AsyncImageLoader();
        loader.execute(filePaths);
        return row;
    }

    class AsyncImageLoader extends AsyncTask<ArrayList<String>,Bitmap,Void>{


        ProgressDialog dialog;


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = ProgressDialog.show(callingActivity,"Loading Images","Please Wait ....");
        }

        @Override
        protected Void doInBackground(ArrayList<String>... arrays) {
            Log.d("Test","Total Images :- "+arrays[0].size());
            for(int i = 0; i< arrays[0].size(); i++)
            {
                Bitmap map = decodeFile(arrays[0].get(i).toString(), 150, 150);
                myImages.add(map);
                publishProgress(map);
            }

            return null;
        }

        @Override
        protected void onProgressUpdate(Bitmap... bitmap) {

            iv_photo.setImageBitmap(bitmap[0]);

        }

        @Override
        protected void onPostExecute(Void aVoid) {
            //super.onPostExecute(aVoid);
            dialog.dismiss();
            /*for(int i = 0; i < myImages.size(); i ++)
            {
                iv_photo.setImageBitmap(myImages.get(i));
            }*/
        }


        public Bitmap decodeFile(String filePath, int WIDTH, int HIGHT) {
            try {

                File f = new File(filePath);

                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(new FileInputStream(f), null, o);

                final int REQUIRED_WIDTH = WIDTH;
                final int REQUIRED_HIGHT = HIGHT;
                int scale = 1;
                while (o.outWidth / scale / 2 >= REQUIRED_WIDTH
                        && o.outHeight / scale / 2 >= REQUIRED_HIGHT)
                    scale *= 2;

                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize = scale;
                return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
}
公共类MyPhotoAdapter扩展了BaseAdapter{
私人活动称为活动;
private ArrayList filepath=new ArrayList();//包含图像的文件路径
ArrayList myImages=新建ArrayList();
私有整数图像宽度;
内部位置;
ImageView iv_照片;
TextView电视地址;
公共MyPhotoAdapter(活动、ArrayList路径、整型宽度)
{
this.callingActivity=活动;
this.filepath=路径;
这个.imageWidth=宽度;
}
@凌驾
public int getCount(){
返回filepath.size();
}
@凌驾
公共对象getItem(int i){
返回this.filepath.get(i);
}
@凌驾
公共长getItemId(int i){
返回0;
}
@凌驾
公共视图getView(int i、视图视图、视图组视图组){
位置=i;
LayoutFlater充气器=(LayoutFlater)调用Activity.getSystemService(Context.LAYOUT\u充气器\u服务);
视图行=充气机。充气(右布局。单张照片,视图组,错误);
iv_photo=(ImageView)row.findviewbyd(R.id.photoView);
tv_address=(TextView)row.findViewById(R.id.tv_address);
AsyncImageLoader=新的AsyncImageLoader();
执行(文件路径);
返回行;
}
类AsyncImageLoader扩展了AsyncTask{
进程对话;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
dialog=ProgressDialog.show(调用活动,“加载图像”,“请稍候…”);
}
@凌驾
受保护的Void doInBackground(ArrayList…arrays){
Log.d(“测试”,“总图像数:-”+数组[0].size());
对于(int i=0;i<数组[0]。size();i++)
{
位图映射=解码文件(数组[0].get(i).toString(),150,150);
添加(地图);
出版进度(地图);
}
返回null;
}
@凌驾
受保护的void onProgressUpdate(位图…位图){
iv_photo.setImageBitmap(位图[0]);
}
@凌驾
受保护的void onPostExecute(void避免){
//super.onPostExecute(避免);
dialog.dismise();
/*对于(int i=0;i=所需的宽度
&&o.外部高度/刻度/2>=所需高度)
比例*=2;
BitmapFactory.Options o2=新的BitmapFactory.Options();
o2.inSampleSize=刻度;
返回BitmapFactory.decodeStream(新文件输入流(f),null,o2);
}catch(filenotfounde异常){
e、 printStackTrace();
}
返回null;
}
}
}

图像仅显示在最后一个列表项中。其他图像视图不显示图像。

您没有处理视图回收,当您的第一个异步任务完成时,您已经创建了3个视图,因此您只能将图像应用于最后一个视图

您需要处理这种并发性,android文档中有一个很好的例子

您不应该将
图像视图
文本视图
作为全局变量存储在适配器中,它们会不断变化

/*
 * Retrive photo from path
 * and return list of path
 */
public static List<String> RetriveImagePathFromSDCard(String path) {
    List<String> tFileList = new ArrayList<String>();
    File f = new File(path);
    if (f.exists()) {
        File[] files = f.listFiles();
        Arrays.sort(files);

        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            if (file.isDirectory())
                continue;
            tFileList.add(file.getPath());

        }
    }

    return tFileList;
}

在适配器类中

private List<String> imgPic;
...
...

public ProjectGalleryPhotoAdapter(Context c, List<String> imagePathList) {
        context = c;
        imgPic  = imagePathList;

}


public View getView(final int position, View view, final ViewGroup parent) {
    .... 
    ....
    ....
Uri uri = Uri.fromFile(new File(imgPic.get(position)));
imageView.setImageURI(uri);

}
私有列表imgPic;
...
...
公共项目GalleryPhotoAdapter(上下文c,列表imagePathList){
上下文=c;
imgPic=图像路径列表;
}
公共视图getView(最终整型位置、视图视图、最终视图组父视图){
.... 
....
....
Uri=Uri.fromFile(新文件(imgPic.get(position));
setImageURI(uri);
}
您可以按照以下步骤了解有关处理并发性的更多信息

我已经修改了你的代码。。。。。请看它是否有用

public class MyPhotoAdapter extends BaseAdapter {

    private Activity callingActivity;
    private ArrayList<String> filePaths = new ArrayList<String>();
    ArrayList<Bitmap> myImages = new ArrayList<Bitmap>();
    private int imageWidth;
    int position;

    ImageView iv_photo;
    TextView tv_address;


    public MyPhotoAdapter(Activity activity,ArrayList<String> paths,int width)
    {
        this.callingActivity = activity;
        this.filePaths = paths;
        this.imageWidth = width;
    }



    @Override
    public int getCount() {
        return filePaths.size();
    }

    @Override
    public Object getItem(int i) {
        return this.filePaths.get(i);
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {

        position = i;

        LayoutInflater inflater = (LayoutInflater) callingActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.single_photo,viewGroup, false);

        iv_photo = (ImageView) row.findViewById(R.id.photoView);
        tv_address = (TextView) row.findViewById(R.id.tv_address);

        AsyncImageLoader loader = new AsyncImageLoader(iv_photo);
        loader.execute(filePaths);
        return row;
    }

    class AsyncImageLoader extends AsyncTask<ArrayList<String>,Bitmap,Void>{


        ProgressDialog dialog;
        private final WeakReference<ImageView> imageViewReference;

        public AsyncImageLoader(ImageView imageView)
        {
            imageViewReference = new WeakReference<ImageView>(imageView);
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = ProgressDialog.show(callingActivity,"Loading Images","Please Wait ....");
        }

        @Override
        protected Void doInBackground(ArrayList<String>... arrays) {
            Log.d("Test","Total Images :- "+arrays[0].size());
            for(int i = 0; i< arrays[0].size(); i++)
            {
                Bitmap map = decodeFile(arrays[0].get(i).toString(), 150, 150);
                myImages.add(map);
                publishProgress(map);
            }

            return null;
        }

        @Override
        protected void onProgressUpdate(Bitmap... bitmap) {

            //iv_photo.setImageBitmap(bitmap[0]);

            if (imageViewReference != null) {
                ImageView imageView = imageViewReference.get();
                if (imageView != null) {
                    imageView.setImageBitmap(bitmap[0]);
                }
            }

        }

        @Override
        protected void onPostExecute(Void aVoid) {
            //super.onPostExecute(aVoid);
            dialog.dismiss();
            /*for(int i = 0; i < myImages.size(); i ++)
            {
                iv_photo.setImageBitmap(myImages.get(i));
            }*/
        }


        public Bitmap decodeFile(String filePath, int WIDTH, int HIGHT) {
            try {

                File f = new File(filePath);

                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(new FileInputStream(f), null, o);

                final int REQUIRED_WIDTH = WIDTH;
                final int REQUIRED_HIGHT = HIGHT;
                int scale = 1;
                while (o.outWidth / scale / 2 >= REQUIRED_WIDTH
                        && o.outHeight / scale / 2 >= REQUIRED_HIGHT)
                    scale *= 2;

                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize = scale;
                return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
}
公共类MyPhotoAdapter扩展了BaseAdapter{
私人活动称为活动;
private ArrayList filepath=new ArrayList();
ArrayList myImages=新建ArrayList();
私有整数图像宽度;
内部位置;
ImageView iv_照片;
TextView电视地址;
公共MyPhotoAdapter(活动、ArrayList路径、整型宽度)
{
this.callingActivity=活动;
this.filepath=路径;
这个.imageWidth=宽度;
}
@凌驾
public int getCount(){
返回filepath.size();
}
@凌驾
公共对象getItem(int i){
返回this.filepath.get(i);
}
@凌驾
公共长getItemId(int i){
返回0;
}
@凌驾
公共视图getView(int i、视图视图、视图组视图组){
位置=i;
LayoutFlater充气器=(LayoutFlater)调用Activity.getSystemService(Context.LAYOUT\u充气器\u服务);
视图行=充气机。充气(右布局
public class MyPhotoAdapter extends BaseAdapter {

    private Activity callingActivity;
    private ArrayList<String> filePaths = new ArrayList<String>();
    ArrayList<Bitmap> myImages = new ArrayList<Bitmap>();
    private int imageWidth;
    int position;

    ImageView iv_photo;
    TextView tv_address;


    public MyPhotoAdapter(Activity activity,ArrayList<String> paths,int width)
    {
        this.callingActivity = activity;
        this.filePaths = paths;
        this.imageWidth = width;
    }



    @Override
    public int getCount() {
        return filePaths.size();
    }

    @Override
    public Object getItem(int i) {
        return this.filePaths.get(i);
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {

        position = i;

        LayoutInflater inflater = (LayoutInflater) callingActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.single_photo,viewGroup, false);

        iv_photo = (ImageView) row.findViewById(R.id.photoView);
        tv_address = (TextView) row.findViewById(R.id.tv_address);

        AsyncImageLoader loader = new AsyncImageLoader(iv_photo);
        loader.execute(filePaths);
        return row;
    }

    class AsyncImageLoader extends AsyncTask<ArrayList<String>,Bitmap,Void>{


        ProgressDialog dialog;
        private final WeakReference<ImageView> imageViewReference;

        public AsyncImageLoader(ImageView imageView)
        {
            imageViewReference = new WeakReference<ImageView>(imageView);
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = ProgressDialog.show(callingActivity,"Loading Images","Please Wait ....");
        }

        @Override
        protected Void doInBackground(ArrayList<String>... arrays) {
            Log.d("Test","Total Images :- "+arrays[0].size());
            for(int i = 0; i< arrays[0].size(); i++)
            {
                Bitmap map = decodeFile(arrays[0].get(i).toString(), 150, 150);
                myImages.add(map);
                publishProgress(map);
            }

            return null;
        }

        @Override
        protected void onProgressUpdate(Bitmap... bitmap) {

            //iv_photo.setImageBitmap(bitmap[0]);

            if (imageViewReference != null) {
                ImageView imageView = imageViewReference.get();
                if (imageView != null) {
                    imageView.setImageBitmap(bitmap[0]);
                }
            }

        }

        @Override
        protected void onPostExecute(Void aVoid) {
            //super.onPostExecute(aVoid);
            dialog.dismiss();
            /*for(int i = 0; i < myImages.size(); i ++)
            {
                iv_photo.setImageBitmap(myImages.get(i));
            }*/
        }


        public Bitmap decodeFile(String filePath, int WIDTH, int HIGHT) {
            try {

                File f = new File(filePath);

                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(new FileInputStream(f), null, o);

                final int REQUIRED_WIDTH = WIDTH;
                final int REQUIRED_HIGHT = HIGHT;
                int scale = 1;
                while (o.outWidth / scale / 2 >= REQUIRED_WIDTH
                        && o.outHeight / scale / 2 >= REQUIRED_HIGHT)
                    scale *= 2;

                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize = scale;
                return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
}