前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android之RecyclerView.Adapter介绍

android之RecyclerView.Adapter介绍

作者头像
李小白是一只喵
发布2020-12-09 14:21:32
2.8K0
发布2020-12-09 14:21:32
举报
文章被收录于专栏:算法微时光

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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<?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"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />


</androidx.constraintlayout.widget.ConstraintLayout>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ?RecyclerView.Adapter
    • onCreateViewHolder(ViewGroup parent, int viewType) 方法
      • onBindViewHolder(ViewHolder viewHolder, int i) 方法.
        • getItemCount() 方法
          • 生命周期
          • 实战
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档