ListView复用导致图片错乱及闪烁问题

ListView使用ViewHolder复用机制可能导致图片错乱和闪烁,尤其是在网络请求不稳定时。为解决这一问题,可以通过给每个ImageView设置唯一URL作为tag,在异步加载图片完成后,比较tag与url是否一致,如果一致才设置图片,不一致则不设置并清除旧图片,以防止闪烁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于ViewHolder复用,我就不说明了,关键是复用导致出现的问题

网络的好坏,我们请求的图片并不是很稳定,那么我们假设一屏可以显示6条数据,利用复用,我们的第7条数据view就是我们的第1条数据view,随之手势不断的滑动,复用的问题,就出现,特别是上网请求网络图片, 我们在显示第7条数据时,图片还是第1个数据图片,因为第7条很可以没有加载完成,导致view复用,图片错乱,那么如何解决呢

  1. 给每个 ImageView设置tag ,tag 的内容就是唯一的url
  2. 异步加载类中输入url
  3. 在异步加载类,完成后,对比ImageView的tag与url是否一致
  4. 一致就设置图片,不一致,就不设置,同时setImageBitmap(null)来解决闪烁问题
public class Myadapter extends BaseAdapter {

    private List<Info.DataBean> list;

    public Myadapter(List<Info.DataBean> list) {
        this.list = list;
    }

    @Override
    public int getCount() {
        return list == null ? 0 : list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

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

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

        Info.DataBean bean = list.get(position);
        MyViewHolder viewHolder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
            viewHolder = new MyViewHolder();
            viewHolder.iv = (ImageView) convertView.findViewById(R.id.iv);
            viewHolder.cb = (CheckBox) convertView.findViewById(R.id.cb);
            viewHolder.title = (TextView) convertView.findViewById(R.id.item_title);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (MyViewHolder) convertView.getTag();
        }

        viewHolder.title.setText(bean.getTitle());
        viewHolder.iv.setTag(bean.getImgs().get(0)); //内容为url的tag
        viewHolder.iv.setImageBitmap(null);  //解决闪烁
        new MyNet(viewHolder.iv).execute(bean.getImgs().get(0)); //加载类中url为图片的url

        return convertView;
    }

    static class MyViewHolder {
        private ImageView iv;
        private TextView title;
        private CheckBox cb;
    }

    class MyNet extends AsyncTask<String, Void, byte[]> {

        private ImageView iv;
        private String path;
        public MyNet(ImageView imageView) {
            this.iv = imageView;
        }
        @Override
        protected byte[] doInBackground(String... params) {
            try {
                URL url = new URL(params[0]);
                path = params[0];
                HttpURLConnection con = (HttpURLConnection) url.openConnection();
                con.setRequestMethod("GET");
                con.setConnectTimeout(5000);
                con.setReadTimeout(5000);
                con.connect();
                if (con.getResponseCode() == HttpURLConnection.HTTP_OK && !isCancelled()) {
                    InputStream inputStream = con.getInputStream();
                    int len;
                    byte[] buff = new byte[1024 * 4];
                    ByteArrayOutputStream bao = new ByteArrayOutputStream();
                    while ((len = inputStream.read(buff)) != -1) {
                        bao.write(buff, 0, len);
                    }
                    inputStream.close();
                    return bao.toByteArray();
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        };

        @Override
        protected void onPostExecute(byte[] bytes) {
            super.onPostExecute(bytes);
            if (bytes != null && iv.getTag().equals(path)) { //加载类中,回来直接判断是不是最新的tag 也 就是最新滑动的item
                iv.setImageBitmap(BitmapFactory.decodeByteArray(bytes,0,bytes.length));
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值