CustomListView : Image is changing when scrolling a ListView

天涯浪子 提交于 2019-12-13 09:25:40

问题



I know that this question is asked many times..
But I cant get any proper solution, In my app I use AsyncTask for loading a image.
I use AsyncTask because I want smooth scrolling listview.. and after implement AsyncTask My listView get smoothly scrolling..
But now problem is that Image is changing after scrolling...
What should I do?
MyAdapter Class

package com.example.adapter;
public class DisplayAllFeedAdapter extends ArrayAdapter<DisplayAllFeedItem> {
    private final List<DisplayAllFeedItem> list;
    private final Activity context;
    ExifInterface exif;

    public DisplayAllFeedAdapter(Activity context, List<DisplayAllFeedItem> list) {
        super(context, R.layout.feed_screen, list);
        this.context = context;
        this.list = list;
    }

    static class ViewHolder {
        public TextView optionalDesc, reportedBy;
        public LinearLayout layout;
        public ImageView displayFeedimg, channelIcon;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = context.getLayoutInflater();
            convertView = inflater.inflate(R.layout.display_all_feed_listitem, null);
            viewHolder = new ViewHolder();

            viewHolder.optionalDesc = (TextView) convertView.findViewById(R.id.txtFeedOptionalDesc);
            viewHolder.reportedBy = (TextView) convertView.findViewById(R.id.txtFeedReportedBy);
            viewHolder.displayFeedimg = (ImageView) convertView
                    .findViewById(R.id.imgFeedDisplayImage);
            viewHolder.layout = (LinearLayout) convertView.findViewById(R.id.layoutChannelImgView);

            convertView.setTag(viewHolder);

            convertView.setTag(R.id.txtFeedOptionalDesc, viewHolder.optionalDesc);
            convertView.setTag(R.id.txtFeedReportedBy, viewHolder.reportedBy);
            convertView.setTag(R.id.imgFeedDisplayImage, viewHolder.displayFeedimg);
            convertView.setTag(R.id.layoutChannelImgView, viewHolder.layout);

        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        String temp;
        String drawableImagePath = list.get(position).getMediaChannelName();
        List<String> channelList = new ArrayList<String>();
        while (drawableImagePath.length() > 0) {

            if (drawableImagePath.indexOf(",") == -1) {
                temp = drawableImagePath.substring(0);
                channelList.add(temp);
                break;
            } else {
                temp = drawableImagePath.substring(0, drawableImagePath.indexOf(","));
            }
            channelList.add(temp);
            drawableImagePath = drawableImagePath.substring(drawableImagePath.indexOf(",") + 1);
        }
        viewHolder.layout.removeAllViews();

        for (int i = 0; i < channelList.size(); i++) {
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(dpToPx(30),
                    dpToPx(30));
            ImageView imageView = new ImageView(context);
            layoutParams.setMargins(0, 0, 10, 0);
            imageView.setLayoutParams(layoutParams);
            imageView.setImageResource(Integer.parseInt(channelList.get(i)));
            viewHolder.layout.addView(imageView);
        }

        String tempPath = list.get(position).getMediaPath();
        File mediaFile = new File(tempPath);
        Bitmap bitmap;

            viewHolder.optionalDesc.setText(list.get(position).getMediaDesc());
        viewHolder.reportedBy.setText("Reported By " + list.get(position).getMediaDisplayName());
        if (viewHolder != null) {
            new LoadImage(viewHolder).execute(tempPath);
        }
        return convertView;
    }

    private class LoadImage extends AsyncTask<String, String, Bitmap> {

        // File mediaFile = new File(tempPath);
        Bitmap bitmap, displayBitmap;
        File mediaFile;
        String mediaPath;
        private final ViewHolder imageViewReference;

        public LoadImage(ViewHolder viewHolder) {
            imageViewReference = viewHolder;
        }

        @Override
        protected Bitmap doInBackground(String... params) {

            // File f = new File(params[0]);
            mediaPath = params[0];

            mediaFile = new File(mediaPath);
            if (mediaFile.exists()) {
                if (isImage(mediaPath)) {
                    Bitmap myBitmap = BitmapFactory.decodeFile(mediaFile.getAbsolutePath());
                    int height = (myBitmap.getHeight() * 512 / myBitmap.getWidth());
                    Bitmap scale = Bitmap.createScaledBitmap(myBitmap, 512, height, true);
                    int rotate = 0;

                    try {
                        exif = new ExifInterface(mediaFile.getAbsolutePath());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                            ExifInterface.ORIENTATION_UNDEFINED);
                    switch (orientation) {
                    case ExifInterface.ORIENTATION_NORMAL:
                        rotate = 0;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_270:
                        rotate = 270;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_180:
                        rotate = 180;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_90:
                        rotate = 90;
                        break;
                    }

                    Matrix matrix = new Matrix();
                    matrix.postRotate(rotate);
                    displayBitmap = Bitmap.createBitmap(scale, 0, 0, scale.getWidth(),
                            scale.getHeight(), matrix, true);

                } else {
                    displayBitmap = ThumbnailUtils.createVideoThumbnail(mediaPath,
                            Thumbnails.MICRO_KIND);

                }

            }
            return displayBitmap;

        }

        @Override
        protected void onPostExecute(Bitmap result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            if (imageViewReference != null) {
                imageViewReference.displayFeedimg.setImageBitmap(result);

            }
            // tempView.displayFeedimg.setImageBitmap(result);

        }
    }

    public int dpToPx(int dp) {
        DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
        int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
        return px;
    }

    public static boolean isImage(String str) {
        boolean temp = false;
        String[] arr = { ".jpeg", ".jpg", ".png", ".bmp", ".gif" };
        for (int i = 0; i < arr.length; i++) {
            temp = str.endsWith(arr[i]);
            if (temp) {
                break;
            }
        }
        return temp;
    }

}

回答1:


I am not clear on your problem (need better clarification) but I know there are issues on loading images about the lag in performance.

Please Look at Google's web Making a Standard Request. Search for (Universal) Image Loader, text "Use ImageLoader and NetworkImageView". You can further improve performance by caching, located below that text.

Code snippet from the webpage:

ImageLoader mImageLoader;
ImageView mImageView;
// The URL for the image that is being loaded.
private static final String IMAGE_URL =
    "http://developer.android.com/images/training/system-ui.png";
...
mImageView = (ImageView) findViewById(R.id.regularImageView);

// Get the ImageLoader through your singleton class.
mImageLoader = MySingleton.getInstance(this).getImageLoader();
mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,
         R.drawable.def_image, R.drawable.err_image));

There seems a good tutorial in Solving the Android image loading problem... by a knowledgeable author. Have fun with this. And someday I may have to solve this problem as well. Pls keep us posted.




回答2:


Besides my previous answer, there is another possible solution. But it is somewhat different than Google's recommendation, so beware...

Look at Stackoverflow discussion ListView like in universal image loader sample app. Checkout code in that page. In CarListAdapter:

ImageLoader = ImageLoader.getInstance();
imageLoader.init(ImageLoaderConfiguration.createDefault(context));

...In another method:

imageLoader.displayImage(...);

Both of my answers lead to one point, use the (Universal) Image Loader.



来源:https://stackoverflow.com/questions/28850368/customlistview-image-is-changing-when-scrolling-a-listview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!