
👀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 一共有多少子项.
生命周期

实战
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
所有评论(0)