(原创)安卓快速使用简单的RecyclerView

发布时间 2023-10-31 09:24:02作者: lmj625

原创声明:本文所有图片和代码皆由本人制作和编写。

前言

这学期刚开的安卓课程,为了写实验上网查资料,只想找简明扼要的教程来让我快速写完实验,不过大多数教程会先进行长篇介绍,对于赶ddl的我有点太详细了。通过实验后,我写下这篇简洁的文章作为备忘录,最后还有个大作业要写。

本文仅涉及最简RecyclerView使用方法,适合用于刚接触安卓的新手。



目标与效果

目标是在一个活动界面显现出一个列表,然后为列表的小项目设置监听器。至于颜色样式,不打算介绍。
image



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>

后记

感谢你看到这里。