首页 > 其他分享 >(原创)安卓快速使用简单的RecyclerView

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

时间:2023-10-31 09:37:14浏览次数:28  
标签:questionList ViewHolder 原创 安卓 question public RecyclerView 适配器

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

目录

前言

这学期刚开的安卓课程,为了写实验上网查资料,只想找简明扼要的教程来让我快速写完实验,不过大多数教程会先进行长篇介绍,对于赶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>

后记

感谢你看到这里。

标签:questionList,ViewHolder,原创,安卓,question,public,RecyclerView,适配器
From: https://www.cnblogs.com/lmj00/p/17797095.html

相关文章

  • 安卓平板,学习平板、三防工业平板Android主板定制方案
    近年来,平板设备在生活和工业领域应用不断增长。学习平板和工业intelligent设备的销量都处在高速发展阶段。预计到2024年,我国平板总出货量将继续增长。安卓平板采用高度集成设计,将多媒体解码、液晶驱动、USB接口、以太网、HDMI输出、TF卡插槽、WiFi、人体感应、串口、......
  • 安卓app开发注意事项及部分源码分享
    随着智能手机的普及,安卓app开发已成为当今的热门领域,在开发过程中,为了提高app的质量和用户体验,需要注意一些关键事项,同时掌握部分源码也是非常必要的。一、安卓app开发注意事项1、安全问题在安卓app开发中,安全问题至关重要,用户数据泄露、恶意等安全问题会给用户带来严重损失,为了确......
  • 推特爆火!超越ChatGPT和Llama2,新一代检索增强方法Self-RAG来了原创
    作者|ZenMoore前言大型语言模型(LLMs)具有出色的能力,但由于完全依赖其内部的参数化知识,它们经常产生包含事实错误的回答,尤其在长尾知识中。为了解决这一问题,之前的研究人员提出了检索增强生成(RAG),它通过检索相关知识来增强LMs的效果,尤其在需要大量知识的任务,如问答中,表现出色。但RAG......
  • 小米自研系统MIOS曝光:链接全生态 非安卓套壳
    导读近日消息,既然小米有打算推出自研系统,那么就应该跟安卓没什么太大关联,这个前期肯定会受到外界的质疑。从最新曝光的细节看,小米自研系统将会跟华为鸿蒙差不多,即MIOS将为手机、物联网设备等生态链接能力提供支持,这是一个全生态的系统平台,毕竟他们也会有汽车这样的超级单......
  • MT4源码,MT4安卓,MT4苹果,MT4CRM源码,MT5CRM源码
    MT4的服务端部署后,安卓苹果手机进行连接,并且连接CRM,组成一个完整的系统。整个流程是先部署MT4服务端,然后通过admin配置修改参数,用manager创建经理账户,然后对接CRM系统进行测试,并且下载安卓手机端测试服务端是否可以正常运行,这个我发一个测试安卓版MetaTrader4管理员-用户指南远程......
  • 常见问题解决 --- 安卓12关闭phantom processes killer杀后台功能
    1.adb连接成功后,执行adbdevices2.执行adbshell3.执行device_configset_sync_disabled_for_testspersistentdevice_configputactivity_managermax_phantom_processes2147483647settingsputglobalsettings_enable_monitor_phantom_procsfalse......
  • uniapp项目APP端安卓ios权限检测教程
    导语:在APP的日常开发过程中,权限检测与授权是不可避免的一项重要的功能,下面就简单介绍一下如何检测和授权的方法。目录原理方法实战原理此授权方法主要是依托于HTML5产业联盟的HTML5+规范实现的。HTML5产业联盟官网获取当前操作系统名称可以使用uni.getSystemInf......
  • 深入研究:Go语言文件写入的性能差异 原创 Go先锋 Go先锋
    深入研究:Go语言文件写入的性能差异原创 Go先锋 Go先锋 2023-10-2811:03 发表于广东收录于合集#Go语言包22个#性能效率1个Go先锋读完需要7分钟速读仅需3分钟  概述在Go语言开发中,文件操作是一个非常常见的任务。在不同的应用场景下,可能会面临选......
  • Android入门教程 | RecyclerView使用入门
    想必大家对列表的表现形式已经不再陌生。手机上有联系人列表,文件列表,短信列表等等。本文讲述的是在Android开发中用RecyclerView来实现列表效果。使用步骤引入RecyclerView在app的build.gradle文件中添加引用。我们使用的是androidx包。gradle:dependencies{//........
  • 智能眼镜主板_AR眼镜光机2023高性能低功耗安卓方案
    AR智能眼镜是一项涉及广泛技术领域的创新产品,其中需要考虑光学、显示、功耗、散热、延迟、重量、佩戴人体工学等多个方面的因素,每个项目都是技术进步所需攻克的难题。今天我们主要来探讨AR眼镜的主板和光学方案设计。AR智能眼镜的主板方案设计采用了高性能主芯片联发科......