「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」
前言
前几天我们一直在照着已经上线的项目仿写,相信你已经积累了不少经验,也遇到了不少bug,相信自己,相信百度,学习就是摸爬滚打的过程,特别是一个你完全都不熟悉的领域,加油吧!!!今天我们依旧是仿写一个已经上线谷歌商店的项目,继续提升我们的实战经验
先看看效果吧
我们可以很明显的看到,这是一个recyclerview,下面就是一个签到的按钮,好啦开始撸代码吧
code
老样子还是xml走起
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout"
//根布局依旧是宽高直接充满
android:layout_width="match_parent"
android:layout_height="match_parent"
//距离左边10dp
android:layout_marginLeft="10dp"
//距离上面10dp
android:layout_marginTop="10dp"
//距离右边10dp
android:layout_marginRight="10dp"
tools:context=".TaskCenterActivity">
<TextView
//很明显这个是个titleTextView
//资源id'
android:id="@+id/tv_title"
//宽高自适应即可
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//距离上下左右15dp
android:layout_margin="15dp"
//默认文本
android:text="每日签到"
//字体颜色
android:textColor="@color/black"
//字体风格,加粗
android:textStyle="bold"
//约束条件
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
//下面的签到天数
<androidx.recyclerview.widget.RecyclerView
//资源id
android:id="@+id/rv"
//宽度充满即可
android:layout_width="match_parent"
//高度自适应即可
android:layout_height="wrap_content"
//距离上方15dp
android:layout_marginTop="15dp"
//约束到title下面
app:layout_constraintTop_toBottomOf="@id/tv_title" />
//下面的签到
<TextView
//id资源id
android:id="@+id/tv_check"
//宽度充满,比较长嘛
android:layout_width="match_parent"
高度自适应即可,我们用padding确定高度
android:layout_height="wrap_content"
//距离上下左右15dp
android:layout_margin="15dp"
//背景颜色
android:background="@color/teal_200"
//文字居中
android:gravity="center"
//这玩意可以设置高度的,算是奇淫技巧
android:padding="15dp"
//默认文本
android:text="签到"
//字体风格
android:textStyle="bold"
//约束条件
app:layout_constraintTop_toBottomOf="@id/rv" />
</androidx.constraintlayout.widget.ConstraintLayout>
复制代码
Activity
private ConstraintLayout mLayout;
private TextView mTvTitle;
private RecyclerView mRv;
private TextView mTvCheck;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_task_center);
initView();
}
private void initView() {
//初始化控件
mLayout = findViewById(R.id.layout);
mTvTitle = findViewById(R.id.tv_title);
mRv = findViewById(R.id.rv);
mTvCheck = findViewById(R.id.tv_check);
//为`签到`设置背景,圆角50,颜色随便
mTvCheck.setBackground(MyShape.setMyShape(this,50, ContextCompat.getColor(this,R.color.teal_200)));
//为recyclerview设置布局管理器,线性布局管理器,横向,不反转
mRv.setLayoutManager(new LinearLayoutManager(this,RecyclerView.HORIZONTAL,false));
//创建recyclerview的适配器,我们用内部的holder确定天数即可
TaskAdapter taskAdapter = new TaskAdapter(this);
//设置适配器
mRv.setAdapter(taskAdapter);
}
复制代码
Adapter
//适配器必须继承自recyclerview.Adapter
public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.ViewHolder> {
private final Context context;
//构造函数,传递一个上下文即可
public TaskAdapter(Context context) {
this.context = context;
}
@NonNull
@NotNull
@Override
public ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
//加载布局
View root = LayoutInflater.from(context).inflate(R.layout.item_task, parent, false);
//传递给ViewHolder
return new ViewHolder(root);
}
//绑定布局
@Override
public void onBindViewHolder(@NonNull @NotNull TaskAdapter.ViewHolder holder, int position) {
//如果下标大于0,我们就重新为item中的天数textview赋值
if (position > 0) {
//数据为当前position+1
holder.tv_day.setText("Day" + (position+1));
}
//为第一个小模块设置圆角+背景,原角度数4,北京随便
holder.item_layout1.setBackground(MyShape.setMyShape(context,4, ContextCompat.getColor(context,R.color.teal_700)));
}
@Override
public int getItemCount() {
//默认7个
return 7;
}
public class ViewHolder extends RecyclerView.ViewHolder {
private final TextView tv_day;
private final ConstraintLayout item_layout1;
public ViewHolder(@NonNull @NotNull View itemView) {
super(itemView);
tv_day = itemView.findViewById(R.id.item_tv_day);
item_layout1 = itemView.findViewById(R.id.item_layout1);
}
}
}
复制代码
我们来看看效果
哇~金色传说!!!