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);
}
//禁止手动滑动
@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
到这里就结束啦
评论