相关文章推荐
星星上的热带鱼  ·  Sn.exe(强名称工具) - .NET ...·  1 年前    · 
风流倜傥的灭火器  ·  [archlinux][tls] ...·  1 年前    · 
风度翩翩的西装  ·  MAC关闭brew每次执行时的自动更新_br ...·  1 年前    · 
豁达的针织衫  ·  如何设置 IE 以在 Office ...·  1 年前    · 
欢快的消炎药  ·  javascript - WebGL ...·  1 年前    · 
Code  ›  android之RecyclerView.Adapter介绍开发者社区
按钮 recyclerview viewholder
https://cloud.tencent.com/developer/article/1758521
睡不着的四季豆
1 年前
作者头像
李小白是一只喵
0 篇文章

android之RecyclerView.Adapter介绍

前往专栏
腾讯云
备案 控制台
开发者社区
学习
实践
活动
专区
工具
TVP
文章/答案/技术大牛
写文章
社区首页 > 专栏 > 算法微时光 > 正文

android之RecyclerView.Adapter介绍

发布 于 2020-12-09 14:21:32
1.7K 0
举报

image.png

?RecyclerView.Adapter

在使用 RecyclerView 这个强大的滚动控件的时候,需要为它提供一个 Adapter 适配器,这个适配器继承自 RecyclerView.Adapter 这个类。

这个类里面有三个抽象方法需要我们去重写,分别是:

  • onCreateViewHolder(ViewGroup parent, int viewType)
  • onBindViewHolder(@NonNull ViewHolder viewHolder, int i)
  • getItemCount() 这三个方法都是由安卓系统去调用的。

onCreateViewHolder(ViewGroup parent, int viewType) 方法

用于加载 RecyclerView 子项的布局,然后返回一个 ViewHolder 对象,ViewHolder 是一个静态内部类,继承自 RecyclerView.ViewHolder 类。

onBindViewHolder(ViewHolder viewHolder, int i) 方法.

为子项绑定数据。 调用这两个方法后,子项就既有了布局又有了数据。

getItemCount() 方法

用于获取 RecyclerView 一共有多少子项.

生命周期

image.png

实战

MainActivity.java:

package com.exmple.adapter;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.OrientationHelper;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
    private List<String> stringList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化集合数据
        initString();
        //获取RecyclerView的id
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.text_cycler);
        //定义布局管理器
        recyclerView.setHasFixedSize(true);
        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, OrientationHelper.VERTICAL);
        //设置recyclerView的布局
        recyclerView.setLayoutManager(layoutManager);
        //定义适配器,传入集合数据
        TextAdapter adapter = new TextAdapter(stringList);
        //为recyclerView设置适配器,即将适配器中数据传入recyclerView中
        recyclerView.setAdapter(adapter);
    //初始化集合数据
    private void initString() {
        for(int i=0; i<2; i++) {
            stringList.add("1111");
            stringList.add("222");
            stringList.add("333");
            stringList.add("444");
            stringList.add("555");
}

TextAdapter.java:

package com.exmple.adapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class TextAdapter extends RecyclerView.Adapter<TextAdapter.ViewHolder>{
    private List<String> stringList;
    //TextAdapter构造函数
    public TextAdapter(List<String> list) {
        stringList = list;
    //ViewHolder类将子项布局中所有控件绑定为一个对象,该对象包含子项布局的所有控件
    static class ViewHolder extends RecyclerView.ViewHolder {
        Button button;
        public static int anInt = 0;
        public ViewHolder(View view) {
            //父类构造函数
            super(view);
            //获取RecyclerView布局的子项布局中的所有控件id,本次实验只有TextView这一种控件
            button = (Button) view.findViewById(R.id.button);
            anInt++;
            Log.d("TextAdpter:","ViewHolder:" + anInt);
    //重写构造方法
    //绑定子项布局
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.text_item,null,false);
        Log.d("TextAdpter:","onCreateViewHolder");
        return new ViewHolder(view);
    //为每个子项绑定数据
    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        //获取当前位置的子项对象
        String str = stringList.get(i);
        //从当前子项对象中获取数据,绑定在viewHolder对象中
//        viewHolder.textView.setText(str);
        Log.d("TextAdpter:","onBindViewHolder: " + str);
    //获取集合的大小
    @Override
    public int getItemCount() {
        Log.d("TextAdpter:","getItemCount: " + stringList.size());
        return stringList.size();
    @Override
    public int getItemViewType(int position) {
        Log.d("TextAdpter:","getItemViewType: " + position);
        return -1;
    @Override
    public void setHasStableIds(boolean hasStableIds) {
        Log.d("TextAdpter:","setHasStableIds");
    @Override
    public long getItemId(int position) {
        Log.d("TextAdpter:","getItemId");
        return -1;
    @Override
    public void registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
        Log.d("TextAdpter:","registerAdapterDataObserver");
    @Override
    public void unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
        Log.d("TextAdpter:","unregisterAdapterDataObserver");
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        Log.d("TextAdpter:","onAttachedToRecyclerView");
    @Override
    public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
        Log.d("TextAdpter:","onDetachedFromRecyclerView");
}

activity_main.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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/text_cycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout_editor_absoluteX="237dp"
        tools:layout_editor_absoluteY="314dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

text_item.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:layout_width="match_parent"
    android:layout_height="match_parent">
        <Button
            android:id="@+id/button"
 
推荐文章
星星上的热带鱼  ·  Sn.exe(强名称工具) - .NET Framework | Microsoft Learn
1 年前
风流倜傥的灭火器  ·  [archlinux][tls] archlinux下使curl支持sslv3的方法 - toong - 博客园
1 年前
风度翩翩的西装  ·  MAC关闭brew每次执行时的自动更新_brew 关闭自动更新_Klaus_S的博客-CSDN博客
1 年前
豁达的针织衫  ·  如何设置 IE 以在 Office 程序中打开 Office 文档 - Browsers | Microsoft Learn
1 年前
欢快的消炎药  ·  javascript - WebGL Error : ArrayBuffer not big enough for request in case of gl.LUMINANCE - Stack Overflow
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号