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

思路分析
获奖名单是一个无限滚动的效果,因此我们可以想到通过使用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);}//禁止手动滑动@Overridepublic 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@Overridepublic MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {View view = LayoutInflater.from(mContext).inflate(R.layout.item_winnlist,null,false);return new MyViewHolder(view);}@Overridepublic void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {WinnListBean winnListBean = mDatas.get(i % mDatas.size());//获取重复数据myViewHolder.itemWinnlistTvPhone.setText(winnListBean.getPhone());myViewHolder.itemWinnlistTvPrize.setText(winnListBean.getPrize());}@Overridepublic 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() {@Overridepublic void run() {//RecyclerView每隔200毫秒向下滚动一次mRecyclerView.smoothScrollBy(0,5);mHandler.postDelayed(this,200);}};mHandler.post(mRunnable);
源码地址:
https://gitee.com/itfitness/WinnListDemo
到这里就结束啦
评论
