自定义控件

Android获奖名单滚动效果

2019-01-24  本文已影响34人  itfitness

前言

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

效果展示

思路分析

获奖名单是一个无限滚动的效果,因此我们可以想到通过使用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

上一篇下一篇

猜你喜欢

热点阅读