模仿TED演讲Android客户端实现item可伸缩变化的listview - 热衷技术,热爱生活

jopen 8年前

    2016注定是收获成功和喜悦的一年,在接下来的一年当中应该更加努力,做一个热衷技术,热爱生活的人!

编程不仅仅会是的我的职业,更多的是一种爱好, 开源会使这个行业更加强大, 自由和创新永远是主旋律.

    之前在使用TED演讲安卓客户端的时候, 作为一个未来的安卓开发者的我,看到了它的listview,于是想到了我应该怎么去实现它呢,然后昨天就抽了点时间写了个小DEMO,放到了github上, 欢迎大家观看, 今天主要是记录一下昨天我想办法实现这个效果的过程..

   由于每个item是在状态有不可见到可见的时候执行动画的, 那么我最初的想法就是在重写listview,在listview中监听每个item的状态, 然后判断是否执行动画, 在listview中拿到adapter的实例, 通过adapter的实例, 获得每个item的View ,然后设置动画集合, 但是在getAdapter().getView的时候出现问题, convertView的参数遇到问题, 不知道怎么解决, 然后发现可能是思路和方向走偏了, 就又想到了去利用adapter, 在adapter中, getView方法是在每个item变为可见状态的时候执行的, 那么这个地方正好满足我的条件,于是就在getView的时候为convertView设置了动画并执行,代码如下,

public View getView(int position, View convertView, ViewGroup parent) {    convertView = LayoutInflater.from(mActivity).inflate(R.layout.list_item, null);    TextView textView = (TextView) convertView.findViewById(R.id.tv);    String s = list.get(position).toString();    textView.setText(s);    AnimationSet set = new AnimationSet(false);    ScaleAnimation scale = new ScaleAnimation(0.5f, 1, 0.5f, 1,      Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,      0.5f);    scale.setDuration(800);    scale.setFillAfter(true);    AlphaAnimation alpha = new AlphaAnimation(0.6f, 1);    alpha.setDuration(1000);    alpha.setFillAfter(true);    set.addAnimation(scale);    set.addAnimation(alpha);    convertView.startAnimation(set);    return convertView;   }

   然后,今天想到了一点点的优化, 使用了ViewHolder减少了findViewByid的次数, 由于按上述的写法的话,每个item每次加载View的时候都得构造动画, 浪费了浪费了空间和时间, 后面将set动画集合保存到静态类ViewHolder中,大大减少了内存分配的次数,代码如下,优化从每一个细节入手;

public View getView(int position, View convertView, ViewGroup parent) {    ViewHolder holder = null;    if(convertView == null){     holder = new ViewHolder();     convertView = LayoutInflater.from(mActivity).inflate(R.layout.list_item, null);     holder.textView = (TextView) convertView.findViewById(R.id.tv);     AnimationSet set = new AnimationSet(false);     ScaleAnimation scale = new ScaleAnimation(0.5f, 1, 0.5f, 1,       Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,       0.5f);     scale.setDuration(800);     scale.setFillAfter(true);     AlphaAnimation alpha = new AlphaAnimation(0.6f, 1);     alpha.setDuration(1000);     alpha.setFillAfter(true);     set.addAnimation(scale);     set.addAnimation(alpha);     holder.set = set;     convertView.setTag(holder);    }else{     holder = (ViewHolder) convertView.getTag();    }    String s = list.get(position).toString();    holder.textView.setText(s);    convertView.startAnimation(holder.set);    return convertView;   }     private static class ViewHolder{    TextView textView;    AnimationSet set;   }

最后,祝大家2016事事顺利,收获成功! 

来自: http://my.oschina.net/limiaoneu/blog/596043