文章目录
一、简述
- 描述:适配器(Adapter)基本每个大项目里都有使用,从说说布局到操作模块布局,适配器(Adapter)一直起着至关重要的作用。
- 难度:初级
- 知识点:适配器(Adapter)的使用
Android中常用的三种适配器
二、添加配置(build.gradle)
implementation 'androidx.recyclerview:recyclerview:1.1.0'
三、数据实体(Data)
public class Data {
String name;
int image;
public String getName() {
return name;
}
public int getImage() {
return image;
}
public void setName(String name) {
this.name = name;
}
public void setImage(int image) {
this.image = image;
}
}
四、三种常见的适配器
1、List适配器
- UI布局(item_list.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="15dp">
<ImageView
android:id="@+id/imageList"
android:layout_width="@dimen/itemMaterialImage"
android:layout_height="@dimen/itemMaterialImage"/>
<TextView
android:id="@+id/nameList"
android:layout_width="match_parent"
android:layout_height="@dimen/itemMaterialNameW"
android:layout_marginLeft="18dp"
android:textSize="50px"/>
</LinearLayout>
- 数据绑定类(ListAdapter.java)
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.hngy.xpq.adapterdemo.R;
import com.hngy.xpq.adapterdemo.bean.Data;
import java.util.List;
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {
private List<Data> listData;
static class ViewHolder extends RecyclerView.ViewHolder {
View fileView;
ImageView imageList;
TextView nameList;
public ViewHolder(View itemView) {
super(itemView);
fileView = itemView;
imageList = itemView.findViewById(R.id.imageList);
nameList = itemView.findViewById(R.id.nameList);
}
}
// 获取到数据
public ListAdapter(List<Data> list) {
this.listData = list;
}
@NonNull
@Override
public ListAdapter.ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list,parent,false);
final ListAdapter.ViewHolder holder = new ListAdapter.ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ListAdapter.ViewHolder holder, int position) {
// 数据绑定
final Data data = listData.get(position);
holder.imageList.setImageResource(data.getImage());
holder.nameList.setText(data.getName());
}
@Override
public int getItemCount() {
return listData.size();
}
}
2、Grid适配器
- UI布局(item_grid.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_margin="5dp"
android:padding="5dp">
<ImageView
android:id="@+id/imageGrid"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"/>
<LinearLayout
android:layout_width="160dp"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:gravity="center">
<TextView
android:id="@+id/nameGrid"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:gravity="center"/>
</LinearLayout>
</LinearLayout>
- 数据绑定类(GridAdapter.java)
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.hngy.xpq.adapterdemo.R;
import com.hngy.xpq.adapterdemo.bean.Data;
import java.util.List;
public class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> {
private List<Data> dataList;
//绑定android界面控件
static class ViewHolder extends RecyclerView.ViewHolder {
View fileView;
ImageView imageGrid;
TextView nameGrid;
public ViewHolder(View itemView) {
super(itemView);
fileView = itemView;
imageGrid = itemView.findViewById(R.id.imageGrid);
nameGrid = itemView.findViewById(R.id.nameGrid);
}
}
public GridAdapter(List<Data> list) {
// 初始化点击数据
this.dataList = list;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_grid,parent,false);
final ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final Data d = dataList.get(position);
holder.imageGrid.setImageResource(d.getImage());
/** --------------------end---------------------- **/
holder.nameGrid.setText(d.getName());
}
@Override
public int getItemCount() {
return dataList.size();
}
}
3、Horizontal适配器
- UI界面(item_h.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingTop="8dp"
android:paddingBottom="8dp">
<ImageView
android:id="@+id/imageH"
android:layout_width="10dp"
android:layout_height="10dp"
android:layout_marginTop="5dp"/>
<TextView
android:id="@+id/nameH"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="10dp"
android:layout_toEndOf="@+id/imageH" />
</RelativeLayout>
- 数据绑定类(HorizontalAdapter.java)
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.hngy.xpq.adapterdemo.R;
import com.hngy.xpq.adapterdemo.bean.Data;
import java.util.List;
public class HorizontalAdapter extends RecyclerView.Adapter<HorizontalAdapter.ViewHolder> {
private List<Data> listData;
static class ViewHolder extends RecyclerView.ViewHolder {
View fileView;
ImageView imageList;
TextView nameList;
public ViewHolder(View itemView) {
super(itemView);
fileView = itemView;
imageList = itemView.findViewById(R.id.imageH);
nameList = itemView.findViewById(R.id.nameH);
}
}
// 获取到数据
public HorizontalAdapter(List<Data> list) {
this.listData = list;
}
@NonNull
@Override
public HorizontalAdapter.ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_h,parent,false);
final HorizontalAdapter.ViewHolder holder = new HorizontalAdapter.ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull HorizontalAdapter.ViewHolder holder, int position) {
// 数据绑定
final Data data = listData.get(position);
holder.imageList.setImageResource(data.getImage());
holder.nameList.setText(data.getName());
}
@Override
public int getItemCount() {
return listData.size();
}
}
五、XXActivity配置
1、适配器初始化
(1)List适配器
// List适配器
private void getListAdapter() {
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(1,StaggeredGridLayoutManager.VERTICAL);
r2.setLayoutManager(layoutManager);
ListAdapter adapter = new ListAdapter(dataList);
r2.setAdapter(adapter);
}
(2)grid适配器
// grid适配器
private void getGridAdapter() {
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
r2.setLayoutManager(layoutManager);
GridAdapter adapter = new GridAdapter(dataList);
r2.setAdapter(adapter);
}
(3)Horizontal适配器
// Horizontal适配器
private void getHorizontalAdapter() {
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(RecyclerView.HORIZONTAL);
r1.setLayoutManager(layoutManager);
HorizontalAdapter adapter = new HorizontalAdapter(h);
r1.setAdapter(adapter);
}
2、UI界面(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="?attr/actionBarSize"
android:orientation="vertical">
<Button
android:id="@+id/qh"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="切换布局"
android:layout_margin="15dp"/>
<!-- 图层一:基础模块 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="40dp"
android:gravity="center">
<!-- listFileType模块 -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/r1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="8dp"
android:paddingRight="8dp"/>
<!-- listFile模块 -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/r2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"/>
</LinearLayout>
</LinearLayout>
2、具体代码(MainActivity.java)
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.hngy.xpq.adapterdemo.adapter.GridAdapter;
import com.hngy.xpq.adapterdemo.adapter.HorizontalAdapter;
import com.hngy.xpq.adapterdemo.adapter.ListAdapter;
import com.hngy.xpq.adapterdemo.bean.Data;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
RecyclerView r1, r2;
Button qh;
boolean index = true;
List<Data> h;
List<Data> dataList; // 获取到具体生成数据的地址
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 绑定控件
onclick();
// 获取数据,这里就不连接服务器接收数据了,主要还是为了copy的初学者能运行成功
dataList = generateData();
h = HorizontalData();
// 初始化布局
init();
}
private void onclick() {
r1 = findViewById(R.id.r1);
r2 = findViewById(R.id.r2);
qh = findViewById(R.id.qh);
// 切换布局
qh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (index) {
getGridAdapter();
} else {
getListAdapter();
}
index = !index;
}
});
}
private List<Data> generateData() {
// 具体生成的数据
List<Data> temp = new ArrayList<>();
for (int i = 0; i < 25; i++) {
Data data = new Data();
data.setImage(R.drawable.ic_launcher_background);
data.setName("item-" + i);
temp.add(data);
}
return temp;
}
private List<Data> HorizontalData() {
// 具体生成的数据
List<Data> temp = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Data data = new Data();
data.setImage(R.drawable.ic_launcher_foreground);
data.setName("操作-" + i);
temp.add(data);
}
return temp;
}
private void init() {
// 生成布局
getListAdapter();
getHorizontalAdapter();
}
// Horizontal适配器
private void getHorizontalAdapter() {
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(RecyclerView.HORIZONTAL);
r1.setLayoutManager(layoutManager);
HorizontalAdapter adapter = new HorizontalAdapter(h);
r1.setAdapter(adapter);
}
// List适配器
private void getListAdapter() {
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(1,StaggeredGridLayoutManager.VERTICAL);
r2.setLayoutManager(layoutManager);
ListAdapter adapter = new ListAdapter(dataList);
r2.setAdapter(adapter);
}
// grid适配器
private void getGridAdapter() {
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
r2.setLayoutManager(layoutManager);
GridAdapter adapter = new GridAdapter(dataList);
r2.setAdapter(adapter);
}
}