滚动下来时列表视图中的动态图像消失

时间:2017-10-27 13:53:03

标签: android bitmap imageview

   public class ImageLoadTask extends AsyncTask<Void, Void, Bitmap> {

    private String url;
    private ImageView imageView;

    public ImageLoadTask(String url, ImageView imageView) {
        this.url = url;
        this.imageView = imageView;
    }

    @Override
    protected Bitmap doInBackground(Void... params) {
        try {
            URL urlConnection = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) urlConnection
                    .openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            return myBitmap;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        imageView.setImageBitmap(result);
    }

}

在列表视图中设置图像时,我这样做

            new ImageLoadTask(courseImageArray[position], ivCourse).execute();

在imageView中,片段启动时图像显示正常。但是一旦我向下滚动并返回,图像就会消失。 请帮助,当列表视图向下滚动时图像消失

以下是适配器的代码(如果需要)

    class CustomAdapter extends BaseAdapter {

    @Override
    public int getCount() {
        return courseArray.length;
    }

    @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) {

        Log.e("listView","listview");
        LayoutInflater layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view1 = layoutInflater.inflate(R.layout.all_course_item, null,true);
        view1.setBackgroundColor(Color.LTGRAY);
        TextView tvCourseName = (TextView)view1.findViewById(R.id.tvCourseName);
        TextView tvHidden = (TextView)view1.findViewById(R.id.tvHidden);
        TextView tvHiddenUrl = (TextView)view1.findViewById(R.id.tvHiddenUrl);
        TextView tvFee= (TextView)view1.findViewById(R.id.tvFee);
        TextView tvStudentsEnrolled = (TextView)view1.findViewById(R.id.tvStudentsEnrolled);
        TextView tvDuration = (TextView)view1.findViewById(R.id.tvDuration);
        if ("free".equals(coursePaidArray[position])) {
            tvFee.setText("FREE");
            tvFee.setTextColor(Color.BLUE);
            Log.e("Its free","free");
        }
        else {
            Log.e("paid", coursePriceArray[position]);
            tvFee.setText(coursePriceArray[position]);
            tvFee.setTextColor(Color.RED);
        }
        TextView tvRegistered = (TextView) view1.findViewById(R.id.tvRegistered);
        ImageView ivCourse = (ImageView) view1.findViewById(R.id.ivCourse);
        tvStudentsEnrolled.setText(numEnrolledArray[position]);
        tvRegistered.setText(courseStatusArray[position]);
        tvHiddenUrl.setText(courseurlArray[position]);
        tvHidden.setText(courseidArray[position]);
        tvCourseName.setText(courseArray[position]);
        tvCourseName.setTextColor(Color.MAGENTA);
        tvDuration.setText(courseDurationArray[position]);
        Log.e("img",courseImageArray[position]);
        new ImageLoadTask(courseImageArray[position], ivCourse).execute();
        //Bitmap bmap = getBitmapFromURL(courseImageArray[position]);
       // ivCourse.setImageBitmap(bmap);
        return view1;
    }
}

让我知道我做错了什么,因为我无法找出任何方法。 感谢

编辑:我使用了PICASSO库并且工作顺利。

1 个答案:

答案 0 :(得分:0)

强烈建议不要为任何视图保留强大的参考。 这样的任务非常复杂。 首先,您应该为要加载图像的图像视图创建WeakeReference<>。 第二件事 - 我建议为传递给AsyncTask的每张图片创建一个标签。 (你的观点可以改变)。 试着看看link。 在官方的Android博客中也有类似的帖子,但我找不到它(