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"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />


</androidx.constraintlayout.widget.ConstraintLayout>

我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:ByLee,邀请大家一同入驻:https://www.oschina.net/sharing-plan/apply

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐