美文网首页自定义控件
Android获奖名单滚动效果

Android获奖名单滚动效果

作者: itfitness | 来源:发表于2019-01-24 17:01 被阅读34次

    前言

    最近公司项目需要一个展示获奖名单的效果,做完之后在此分享出来。

    效果展示

    思路分析

    获奖名单是一个无限滚动的效果,因此我们可以想到通过使用RecyclerView来加载无限的条目,然后通过不断的自动向下滑动RecyclerView来实现这个效果,但是获奖名单不能手动滑动因此我们需要将其滑动功能屏蔽掉。

    实现禁止滑动的RecyclerView

    public class MyRecyclerView extends RecyclerView {
        public MyRecyclerView(Context context) {
            this(context,null);
        }
    
        public MyRecyclerView(Context context, @Nullable AttributeSet attrs) {
            this(context, attrs,0);
        }
    
        public MyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
        //禁止手动滑动
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            return true;
        }
    }
    

    Adapter编写(实现加载无限重复数据的关键)

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
        //这里的WinnListBean是我模拟的中奖数据
        private List<WinnListBean> mDatas;
        private Context mContext;
    
        public MyAdapter(List<WinnListBean> mDatas, Context mContext) {
            this.mDatas = mDatas;
            this.mContext = mContext;
        }
    
        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.item_winnlist,null,false);
            return new MyViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
            WinnListBean winnListBean = mDatas.get(i % mDatas.size());//获取重复数据
            myViewHolder.itemWinnlistTvPhone.setText(winnListBean.getPhone());
            myViewHolder.itemWinnlistTvPrize.setText(winnListBean.getPrize());
        }
        @Override
        public int getItemCount() {
    //        本案例一页最多显示6条数据,因此设置如果数据数量大于6等于6才开始滚动
            if(mDatas.size()>5){
    //            展示无限数据
                return Integer.MAX_VALUE;
            }else {
                return mDatas.size();
            }
        }
        static class MyViewHolder extends RecyclerView.ViewHolder{
            private TextView itemWinnlistTvPhone;
            private TextView itemWinnlistTvPrize;
            public MyViewHolder(@NonNull View itemView) {
                super(itemView);
                itemWinnlistTvPhone = (TextView) itemView.findViewById(R.id.item_winnlist_tv_phone);
                itemWinnlistTvPrize = (TextView) itemView.findViewById(R.id.item_winnlist_tv_prize);
            }
        }
    }
    
    

    实现自动滚动

    这里的自动滚动是使用的RecyclerView的smoothScrollBy()方法结合Handler来实现的。

    mHandler=new Handler();
            mRunnable = new Runnable() {
                @Override
                public void run() {
                    //RecyclerView每隔200毫秒向下滚动一次
                    mRecyclerView.smoothScrollBy(0,5);
                    mHandler.postDelayed(this,200);
                }
            };
    mHandler.post(mRunnable);
    

    项目源码:https://gitee.com/itfitness/WinnListDemo

    相关文章

      网友评论

        本文标题:Android获奖名单滚动效果

        本文链接:https://www.haomeiwen.com/subject/vilujqtx.html