本文参考了网上的实现思路,使用了阿里的vlayout来实现,这里用vlayout只是单纯的熟悉一下vlayout的使用方法,毕竟vlayout还是可以解决很大部分UI需求。
首先看一下效果:
首先说一下思路:
1:数据,每一个奖项都是一个对象,需要设置id以及name
2:拿到数据集合,需要对id做一下处理,因为选中是圆形顺序转动,数据显示是集合顺序显示,这时候需要按照转动顺序获取到id集合
3:需要设置随机时长,根据结束时候的选中id,获取中奖信息。
首先用vlayout来实现列表:
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
VirtualLayoutManager layoutManager = new VirtualLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
//设置三列
GridLayoutHelper gridLayoutHelper = new GridLayoutHelper(3);
//设置数据长度,根据后台数据判断即可
gridLayoutHelper.setItemCount(9);
//管理LayoutHelper集合
final List<LayoutHelper> helpers = new LinkedList<>();
//添加gridlayout布局
helpers.add(gridLayoutHelper);
//设置布局管理器
layoutManager.setLayoutHelpers(helpers);
//设置item间隔
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.set(1, 1, 1, 1);
}
});
//设置适配器
recyclerView.setAdapter(new VirtualLayoutAdapter(layoutManager) {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MainViewHolder(new TextView(MainActivity.this));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
VirtualLayoutManager.LayoutParams layoutParams = new VirtualLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100);
holder.itemView.setLayoutParams(layoutParams);
((TextView) holder.itemView).setGravity(Gravity.CENTER);
if (position == 4) {
holder.itemView.setBackgroundColor(Color.WHITE);
((TextView) holder.itemView).setText("开始");
} else {
holder.itemView.setBackgroundResource(R.drawable.bg_item);
((TextView) holder.itemView).setText(Integer.toString(position));
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (position==4){
}else {
}
}
});
}
@Override
public int getItemCount() {
//这个主要计算布局item数量
List<LayoutHelper> helpers = getLayoutHelpers();
if (helpers == null) {
return 0;
}
int count = 0;
for (int i = 0, size = helpers.size(); i < size; i++) {
//遍历每一个helper,拿到每一个helper的数据长度累加
count += helpers.get(i).getItemCount();
}
return count;
}
});
}
MainViewHolder
static class MainViewHolder extends RecyclerView.ViewHolder {
public MainViewHolder(View itemView) {
super(itemView);
}
}
这样就实现了3x3的gridlayout的列表布局,并设置样式。
然后需要开启一个线程,遍历id列表,去刷新背景,显示一个转动的效果
class MyRunnable implements Runnable{
@Override
public void run() {
handler.sendEmptyMessage(0);
if(startTime>=stopTime){
handler.removeCallbacks(myRunnable);
if(array_id[num]==5){
Toast.makeText(MainActivity.this,array_id[num]+"中奖了",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this,array_id[num]+"未中奖",Toast.LENGTH_SHORT).show();
}
startTime=0;
return;
}
handler.postDelayed(myRunnable,100);
startTime+=100;
}
}
这里设置id为5为中奖,中奖也必须根据id来判断。每100毫秒发送刷新一次,如果起始时间大于等于结束时间(随机时间),则停止线程,拿到当前id去判断是否中奖。
接收消息并处理:
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Change(array_id[num]);
num++;
if (num >=8) {
num = 0;
}
}
};
private void Change(int num) {
for (int i=0;i<recyclerView.getChildCount();i++){
if(i==num){
recyclerView.getChildAt(i).setSelected(true);
}else if(i==4){
continue;
}else {
recyclerView.getChildAt(i).setSelected(false);
}
}
}
在ViewHolder中设置开启线程以及UI
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
VirtualLayoutManager.LayoutParams layoutParams = new VirtualLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100);
holder.itemView.setLayoutParams(layoutParams);
((TextView) holder.itemView).setGravity(Gravity.CENTER);
if (position == 4) {
holder.itemView.setBackgroundColor(Color.WHITE);
((TextView) holder.itemView).setText("开始");
} else {
holder.itemView.setBackgroundResource(R.drawable.bg_item);
((TextView) holder.itemView).setText(Integer.toString(position));
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (position==4){
myRunnable.run();
}else {
Toast.makeText(MainActivity.this,"选中了"+position,Toast.LENGTH_SHORT).show();
}
}
});
}
本文参考了http://blog.csdn.net/qq_31530015/article/details/51287053,非常感谢。
代码没有多大意义,主要是体验一下实现思路,自己敲一下才能明白自己思路问题出在哪里