原创声明:本文所有图片和代码皆由本人制作和编写。
前言
这学期刚开的安卓课程,为了写实验上网查资料,只想找简明扼要的教程来让我快速写完实验,不过大多数教程会先进行长篇介绍,对于赶ddl的我有点太详细了。通过实验后,我写下这篇简洁的文章作为备忘录,最后还有个大作业要写。
本文仅涉及最简RecyclerView使用方法,适合用于刚接触安卓的新手。
目标与效果
目标是在一个活动界面显现出一个列表,然后为列表的小项目设置监听器。至于颜色样式,不打算介绍。
3步走
第一:在布局文件添加RecyclerView组件
哪个活动需要RecyclerView组件就在该活动的.xml布局文件添加如下代码:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/question_recycler_View"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
第二:创建适配器
创建一个适配器类,继承自RecyclerView.Adapter<QuestionsListAdapter.ViewHolder>。
为适配器提供每一个小条目的布局
新创建一个布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView
android:layout_marginVertical="5dp"
android:paddingVertical="5dp"
android:paddingHorizontal="10dp"
android:id="@+id/question_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="24sp"
android:layout_marginLeft="20dip"
android:layout_marginTop="5dp"
/>
</LinearLayout>
为适配器提供要显示的内容数据
当 RecyclerView 需要显示一个新的列表项时,它会调用 onBindViewHolder 方法。它会根据位置获取对应位置的数据,并将数据绑定到视图上。
//下面这个构造器是因为我的题目需要有问题的序号,questionList就是String[] data。
public QuestionsListAdapter(List<Questions.Question> questionList, Context ctx) {
if (BuildConfig.DEBUG && questionList == null) {
Log.d(TAG, "QuestionsListAdapter: questionList == null");
}
this.questionList = questionList;
context = ctx;
}
//重写
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Questions.Question question = questionList.get(position);
holder.questionTitle.setText("第" + question.questionID + "题");
}
在适配器里完成事件监听器
内部类ViewHolder
static class ViewHolder extends RecyclerView.ViewHolder {
View typeView;
TextView questionTitle;
public ViewHolder(View view) {
super(view);
typeView = view;
//和刚刚写的小条目的布局里的控件进行联系
questionTitle = view.findViewById(R.id.question_title);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//和刚刚写的小条目的布局文件进行联系
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.question_title_item, parent, false);
final ViewHolder holder = new ViewHolder(view);
// 点击事件
holder.typeView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getAdapterPosition();
Questions.Question question = questionList.get(position);
//我这里需要实现点击题号,跳转到显示题干界面,所以通过Intent传递了被点击的题干
Intent i = new Intent(context, ShowQuestionActivity.class);
i.putExtra(EXTRA_TEXT,question.getText());
context.startActivity(i);
}
});
return holder;
}
第三: 把第一步的布局里的RecyclerView组件和第二步的适配器关联到主活动
public class QuestionListActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//第一步的布局文件
setContentView(R.layout.activity_question_list);
Questions questions = new Questions();
//第一步的布局文件里的RecyclerView控件
RecyclerView recyclerView = findViewById(R.id.question_recycler_View);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置分割线
recyclerView.addItemDecoration( new DividerItemDecoration(QuestionListActivity.this,1));
//关联适配器类
RecyclerView.Adapter adapter = new QuestionsListAdapter(questions.getQuestionList(),QuestionListActivity.this);
//把第一步的布局文件里的RecyclerView控件和适配器联系起来
recyclerView.setAdapter(adapter);
}
}
总体来看这个适配器类
public class QuestionsListAdapter extends
RecyclerView.Adapter<QuestionsListAdapter.ViewHolder> {
private static final String TAG = "QuestionsListAdapter";
private static final String EXTRA_TEXT = "questionText";
public static String getExtraText(){
return EXTRA_TEXT;
}
private Context context;
static class ViewHolder extends RecyclerView.ViewHolder {
View typeView;
TextView questionTitle;
public ViewHolder(View view) {
super(view);
typeView = view;
questionTitle = view.findViewById(R.id.question_title);
}
}
private List<Questions.Question> questionList;
public QuestionsListAdapter(List<Questions.Question> questionList, Context ctx) {
if (BuildConfig.DEBUG && questionList == null) {
Log.d(TAG, "QuestionsListAdapter: questionList == null");
}
this.questionList = questionList;
context = ctx;
}
@Override
public int getItemCount() {
return questionList.size();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.question_title_item, parent, false);
final ViewHolder holder = new ViewHolder(view);
// 点击事件
holder.typeView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getAdapterPosition();
Questions.Question question = questionList.get(position);
Intent i = new Intent(context, ShowQuestionActivity.class);
i.putExtra(EXTRA_TEXT,question.getText());
context.startActivity(i);
}
});
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Questions.Question question = questionList.get(position);
holder.questionTitle.setText("第" + question.questionID + "题");
}
}
关于我写的小条目的样式
我在drawable里面编写了一个文件rounded_corner_background,然后给小条目的布局写上android:background="@drawable/rounded_corner_background"即可:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ABB6F6" /> <!-- 填充颜色 -->
<corners android:radius="12dp" /> <!-- 圆角半径 -->
<stroke
android:width="1dp"
android:color="#5A618C" />
</shape>
后记
感谢你看到这里。
标签:questionList,ViewHolder,原创,安卓,question,public,RecyclerView,适配器 From: https://www.cnblogs.com/lmj00/p/17797095.html