解决Android快速滑动时图片一闪一闪问题

快速滑动图片一闪一闪的问题,图片加载等处理在这里不介绍,主要就是介绍下在Adapter中维护一个LinkedHashMap解决上述问题

package com.longraise.seller.adapter;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.longraise.seller.R;
import com.longraise.seller.view.VoiceButton;

import java.lang.ref.SoftReference;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import cc.sdkutil.control.image.CCImageLoader;
import cc.sdkutil.control.image.CCImageLoaderCallback;
import cc.sdkutil.control.inject.CCInjectUtil;
import cc.sdkutil.model.inject.CCInjectRes;

/**
 * Created by wangcong on 15-1-8.
 */
public class OrderFinishAdapter extends BaseAdapter {

  //convertview id
  private final static int BASE_ID = 0x0fff00;

  private Context mContext;
  private List<Map<String, Object>> mAllList;

  //图片加载相关
  CCImageLoader mImageLoader;
  //用于缓存图片,减小快速滑动时图片显示落帧现象
  final LinkedHashMap<String, SoftReference<Bitmap>> linkedHashMap;
  final int MAX_SIZE = 16;

  public OrderFinishAdapter(Context context, List<Map<String, Object>> list) {
    this.mContext = context;
    this.mAllList = list;
    linkedHashMap = new LinkedHashMap<String, SoftReference<Bitmap>>(16, 0.75f, true) {

      private static final long serialVersionUID = 1L;

      @Override
      protected boolean removeEldestEntry(Entry<String, SoftReference<Bitmap>> eldest) {
        boolean flag = size() > MAX_SIZE;
        if (flag) {
          SoftReference<Bitmap> softReference = eldest.getValue();
          Bitmap bitmap = softReference.get();
          if (bitmap != null) bitmap.recycle();
          remove(eldest.getKey());
        }
        return flag;
      }
    };
  }

  public int getCount() {
    return mAllList.size();
  }

  public Object getItem(int position) {
    return mAllList.get(position);
  }

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

  @SuppressWarnings("deprecation")
  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if (convertView == null) {
      convertView = LayoutInflater.from(mContext).inflate(R.layout.adapter_finish_item, parent, false);
      holder = new ViewHolder();
      CCInjectUtil.inject(holder, convertView);
      convertView.setTag(holder);
    } else {
      holder = (ViewHolder) convertView.getTag();
    }
    convertView.setId(BASE_ID + position);
    final Map<String, Object> map = mAllList.get(position);
    //处理图片
    SoftReference<Bitmap> softReference = linkedHashMap.get(map.get("orderImgUrl"));
    Bitmap bitmap = softReference == null ? null : softReference.get();
    if (bitmap == null) {
      holder.image.setBackgroundResource(R.drawable.default_image_error);
      if (mImageLoader == null)
        mImageLoader = new CCImageLoader.Builder().needCacheInDisk().outSize(120, 120)
            .callback(new CCImageLoaderCallback() {
              @Override
              public void onSuccess(Bitmap bitmap, Object... objs) {
                super.onSuccess(bitmap, objs);
                if (bitmap != null) { //图片加载成功后处理
                  ImageView imageView = (ImageView) objs[0];
                  imageView.setBackgroundDrawable(new BitmapDrawable(mContext.getResources(), bitmap));
                  SoftReference<Bitmap> soft = new SoftReference<Bitmap>(bitmap);
                  linkedHashMap.put(objs[1] + "", soft);
                  bitmap = null;
                }
              }
            }).build();
      mImageLoader.loadNetImage(map.get("orderImgUrl") + "", holder.image, map.get("orderImgUrl"));
    } else {
      holder.image.setBackgroundDrawable(new BitmapDrawable(mContext.getResources(), bitmap));
    }

    return convertView;
  }

  static class ViewHolder {

    @CCInjectRes(R.id.order_item_image)
    ImageView image;
  }
}

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • Android实现图片自动轮播并且支持手势左右无限滑动

    废话不多说了,先给大家上左右无限滑动的代码了. 1.左右无限滑动 public class MainActivity extends AppCompatActivity { private static ViewPager viewPager; private RadioGroup group; //图片资源,实际项目需要从网络获取 private int[] imageIds = {R.drawable.ym1, R.drawable.ym2, R.drawable.ym3, R.drawab

  • Android实现手势滑动多点触摸放大缩小图片效果

    网上文章虽多,但是这种效果少之又少,我真诚的献上以供大家参考 实现原理:自定义ImageView对此控件进行相应的layout(动态布局). 这里你要明白几个方法执行的流程: 首先ImageView是继承自View的子类. onLayout方法:是一个回调方法.该方法会在在View中的layout方法中执行,在执行layout方法前面会首先执行setFrame方法. setFrame方法:判断我们的View是否发生变化,如果发生变化,那么将最新的l,t,r,b传递给View,然后刷新进行动态更新

  • Android实现探探图片滑动效果

    之前一段时间,在朋友的推荐下,玩了探探这一款软件,初玩的时候,就发现,这款软件与一般的社交软件如陌陌之类的大相径庭,让我耳目一新,特别是探探里关于图片滑动操作让人觉得非常新鲜.所以在下通过网上之前的前辈的经历加上自己的理解,也来涉涉水.下面是网上找的探探的原界面 当时就非常想通过自己来实现这种仿探探式的效果,然而却没什么思路.不过毋庸置疑的是,这种效果的原理肯定和 ListView /RecyclerView 类似,涉及到 Item View 的回收和重用,否则早就因为大量的 Item View

  • Android多点触控实现对图片放大缩小平移,惯性滑动等功能

    文章将在原有基础之上做了一些扩展功能: 1.图片的惯性滑动 2.图片缩放小于正常比例时,松手会自动回弹成正常比例 3.图片缩放大于最大比例时,松手会自动回弹成最大比例 实现图片的缩放,平移,双击缩放等基本功能的代码如下,每一行代码我都做了详细的注释 public class ZoomImageView extends ImageView implements ScaleGestureDetector.OnScaleGestureListener, View.OnTouchListener , V

  • android Gallery组件实现的iPhone图片滑动效果实例

    实现的效果图,可左右滑动: 一.先在将Gallery标签放入: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="vertical"     android:layo

  • Android实现手势滑动多点触摸缩放平移图片效果

    现在app中,图片预览功能肯定是少不了的,用户基本已经形成条件反射,看到小图,点击看大图,看到大图两个手指开始进行放大,放大后,开始移动到指定部位. 一.概述 想要做到图片支持多点触控,自由的进行缩放.平移,需要了解几个知识点:Matrix , GestureDetector , ScaleGestureDetector 以及事件分发机制,ps:不会咋办,不会你懂的. 1.Matrix 矩阵,看深入了都是3维矩阵的乘啊什么的,怪麻烦的~~ 其实这么了解下就行了: Matrix 数据结构:3维矩阵

  • Android开发之使用ViewPager实现图片左右滑动切换效果

    Android中图片的左右切换随处可见,今天我也试着查阅资料试着做了一下,挺简单的一个小Demo,却也发现了一些问题,话不多说,上代码~: 使用了3个xml文件作为ViewPager的滑动page,布局都是相同的,如下只展示其中之一: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/

  • Android手势滑动实现ImageView缩放图片大小

    本文推出了两种Android手势实现ImageView缩放图片大小的方法,分享给大家供大家参考,具体内容如下 方法一: 将以下代码写到MulitPointTouchListener.java中,然后对你相应的图片进行OnTouchListener. 例如:imageView.setOnTouchListener(new MulitPointTouchListener ()); 在xml中要将ImageView的缩放格式改成Matrix 例如:android:scaleType="matrix&q

  • Android实现Banner界面广告图片循环轮播(包括实现手动滑动循环)

    前言:经常会看到有一些app的banner界面可以实现循环播放多个广告图片和手动滑动循环.本以为单纯的ViewPager就可以实现这些功能.但是蛋疼的事情来了,ViewPager并不支持循环翻页.所以要实现循环还得需要自己去动手.自己在网上也找了些例子,本博文的Demo是结合自己找到的一些相关例子的基础上去改造,也希望对读者有用. Demo实现的效果图如下: Demo代码: 工程目录如下图: 废话不多说,上代码. 1.主Activity代码如下: package com.stevenhu.and

  • Android 利用ViewPager实现图片可以左右循环滑动效果附代码下载

    首先给大家展示靓照,对效果图感兴趣的朋友可以继续往下阅读哦. ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,上面是效果图,用美女图片是我一贯的作风,呵呵  1.    首先看一些layout下的xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width=&qu

随机推荐