ListView或GridView添加加载列表动画

这里写图片描述

要想实现加载ListView或者GridView控件时带有一定的加载动画,如上图所示,而不是默认的动画样式,最好借助Github上的一个成熟的开源库 — ListViewAnimatin,GitHub地址见 nhaarman/ListViewAnimations
使用起来非常简单,几步搞定;
需要添加listviewanimations_lib-core_3.1.0.jar和nineoldandroids-2.4.0.jar这两个jar包
再添加三行代码即可
所有代码如下(不包括布局):

public class ListViewAnimationActivity extends BaseActivity {

    private ListView mListView;
    private MyAdapter myAdapter;
    private List<String> listData = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout_listview_animation);

        mListView = (ListView) findViewById(R.id.id_listview_animation);
        listData.clear();
        for(int i = 0;i<20;i++){
            String title = "我是第"+(i+1)+"只小小鸟,想要飞";
            listData.add(title);
        }

        myAdapter = new MyAdapter(listData);
        // 核心代码如下
        AnimationAdapter animAdapter = new MyAnimationAdapter(myAdapter);
        animAdapter.setAbsListView(mListView);
        // 设置动画延时加载
        assert animAdapter.getViewAnimator() != null;
        animAdapter.getViewAnimator().setInitialDelayMillis(300);
        // 把绑定了listview适配器的AnimationAdapter设置到ListView上
        mListView.setAdapter(animAdapter);
    }

    private class MyAdapter extends BaseAdapter {

        List<String> mListData;

        public MyAdapter(List<String> mListData) {
            super();
            this.mListData = mListData;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return mListData.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return mListData.get(position);
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Holder holder;
            if(convertView == null){
                holder = new Holder();
                LayoutInflater inflater = LayoutInflater.from(ListViewAnimationActivity.this);
                convertView = inflater.inflate(R.layout.listview_animation_item, null);
                holder.text = (TextView) convertView.findViewById(R.id.listviw_item_title);
                convertView.setTag(holder);
            }else{
                holder = (Holder) convertView.getTag();
            }
            holder.text.setText(mListData.get(position));
            return convertView;
        }

        class Holder{
            TextView text;

        }

    }

    public class MyAnimationAdapter extends AnimationAdapter {

        public MyAnimationAdapter(BaseAdapter baseAdapter) {
            super(baseAdapter);
            // TODO Auto-generated constructor stub
        }

        @Override
        public Animator[] getAnimators(ViewGroup parent, View view) {
            // TODO Auto-generated method stub
            Animator bottomInAnimator = ObjectAnimator.ofFloat(view,
                    "translationY", 500, 0);
            Animator rightInAnimator = ObjectAnimator.ofFloat(view,
                    "translationX", parent.getWidth(), 0);
            return new Animator[] { bottomInAnimator, rightInAnimator };
        }

    }

}

这里面的MyAnimationAdapter中的getAnimators可以更换成你想要的任何其他属性动画样式,而且这种动画不仅仅适用于ListView,对于GridView同样有效

ListView在部分机型上(比如努比亚)长按和点击事件同时被触发的问题,就是你为listview设置了OnItemClick和OnItemLongClick两个事件,当你长按ListView时,会先执行了长按事件里的方法(比如弹框),当你松开手后弹框是出来了,但点击事件里的方法(比如进入下一个页面)也被执行了,要想解决这种冲突,据我所知,很简单,只要把长按事件的返回值由false改为true即可,大意应该是不让事件再往下传递,仅此记录下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值