CustomListView:图像滚动一个ListView时改变 [英] CustomListView : Image is changing when scrolling a ListView

查看:174
本文介绍了CustomListView:图像滚动一个ListView时改变的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

结果我知道这个问题是问了很多次..结果,但我不能得到任何妥善的解决办法,在我的应用我使用的AsyncTask 加载一个图片。结果我用的AsyncTask ,因为我想平滑滚动列表视图..和实施后的AsyncTask 我的ListView得到顺利滚动。 。结果但现在的问题是,图片是滚动...后更改​​结果,我应该怎么办?
结果MyAdapter类搜索


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;
    }

}


推荐答案

除我的previous答案,还有另一种可能的解决方案。但它是比谷歌的建议有所不同,所以要小心...

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

看讨论#1 <一个href=\"http://stackoverflow.com/questions/16941128/listview-like-in-universal-image-loader-sample-app\">ListView像通用图像加载器示例应用程序。结帐code。在页。在CarListAdapter:

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.

这篇关于CustomListView:图像滚动一个ListView时改变的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆