最近一直整理一下RecycleView相关的知识,由于懒病发作,今天开始,加油,人是被逼出来的。
话不多说,开整。首先要学会如何使用recylceView。
1.使用recycleView先添加依赖,在App/buidle.gradle中
dependencies {
....
implementation 'com.android.support:recyclerview-v7:27.1.0'
...
}
2. 在主布局中添加RecycleView
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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/recycle"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
3. 接下来就是具体如何来使用了
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private ArrayList<ItemBean> mData;
private ItemBean itemBean;
private com.example.myapplication.ListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.准备控件
recyclerView = findViewById(R.id.recycle);
//2.准备数据
initData();
//3.显示
showRecycle();
}
private void initData() {
//创建数据集合
mData = new ArrayList<>();
//创建数据模型
for (int i = 0; i < Datas.icons.length; i++) {
//创建数据对象
itemBean = new ItemBean();
itemBean.icon = Datas.icons[i];
itemBean.title = "我是第" + i + "数据";
mData.add(itemBean);
}
}
private void showRecycle() {
//recycleView 需要设置布局管理器
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
adapter = new com.example.myapplication.ListAdapter(mData);
recyclerView.setAdapter(adapter);
}
}
? ? ? 在? onCreate()方法中,首先准备RecycleView控件, 之后,就是准备数据,然后显示。
recyclerView = findViewById(R.id.recycle);
? ? ? ? 在initData()方法,数据准备的过程中,我们创建了一个数据集合ArrayList<>();ArrayList 中的元素是ItemBean。
这里看一下ItemBean的结构。
public class ItemBean {
public int icon;
public String title;
}
? ? ? ? 只包含两个元素,icon和title,当然在工作过程中,这些数据是从接口中获取的,我们这里暂时使用本地的数据Datas,主要为了展示如何使用RecycleView。可以看一下Datas到底是什么。
public class Datas {
public static int[] icons = {
R.mipmap.pic_01,
R.mipmap.pic_02,
R.mipmap.pic_03,
R.mipmap.pic_04,
...
};
}
? ? ? ? 在Datas中只有一个静态的Int类型的数据,里面都是一些加载的res中的图片资源。
继续回到initData()方法中,创建一个子元素为itemBean的ArrayList的数据集合mData,然后通过for循环从Datas中取出数据,并将icon赋值给创建itemBean对象。最后将itemBean对象,加入到mData集合中。
? ? ? ?在showRecycle()方法中。首先创建一个布局管理器LinearLayoutManager(有很多中,后面慢慢介绍),然后将LinearLayoutManager传递给RecycleView。下面就是最重要的部分,创建Adapter。
adapter = new com.example.myapplication.ListAdapter(mData);
? ? ? 这个ListAdapter是我们自己创建的类,下面就来重点看一下,在这个类中,都干了什么。
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.MyAdapter> {
private final List<ItemBean> mData;
private View view;
public ListAdapter(List<ItemBean> mData) {
this.mData = mData;
}
/**
* 这个方法用于创建条目的view
* @param parent
* @param viewType
* @return
*/
@NonNull
@Override
public MyAdapter onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
view = View.inflate(parent.getContext(), R.layout.recycle_view, null);
return new MyAdapter(view);
}
/**
* 这个方法用来绑定holder的,一般用来设置数据
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(@NonNull MyAdapter holder, int position) {
holder.setData(mData.get(position),position);
}
/**
* 返回条目的个数
* @return
*/
@Override
public int getItemCount() {
if (mData != null) {
return mData.size();
}
return 0;
}
public class MyAdapter extends RecyclerView.ViewHolder {
private ImageView imageView;
private TextView tv;
private int position;
public MyAdapter(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.icon);
tv = itemView.findViewById(R.id.title);
}
public void setData(ItemBean itemBean, int position) {
this.position = position;
tv.setText(itemBean.title);
imageView.setImageResource(itemBean.icon);
}
}
}
? ? ?首先ListAdapter 继承 RecyclerView.Adapter<ListAdapter.MyAdapter>,泛型为ListAdapter.MyAdapter。
? ? 在ListAdapter中主要有三个方法。
/**
* 这个方法用于创建条目的view
* @param parent
* @param viewType
* @return
*/
@NonNull
@Override
public MyAdapter onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
view = View.inflate(parent.getContext(), R.layout.recycle_view, null);
return new MyAdapter(view);
}
? ? ? 这个方法主要用来创建条目的view,并且返回MyAdapter的实例(这个是ListAdapter的内部类)。
/**
* 这个方法用来绑定holder的,一般用来设置数据
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(@NonNull MyAdapter holder, int position) {
holder.setData(mData.get(position),position);
}
? ? ? ? 这个方法是用来绑定holder的,这里的holder我们可以看到就是自定义的内布类。
/**
* 返回条目的个数
* @return
*/
@Override
public int getItemCount() {
if (mData != null) {
return mData.size();
}
return 0;
}
? ?这个方法用来返回条目的个数。
? ? 下面我们具体来看一下这个内部类。
public class MyAdapter extends RecyclerView.ViewHolder {
private ImageView imageView;
private TextView tv;
private int position;
public MyAdapter(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.icon);
tv = itemView.findViewById(R.id.title);
}
public void setData(ItemBean itemBean, int position) {
this.position = position;
tv.setText(itemBean.title);
imageView.setImageResource(itemBean.icon);
}
}
? ? ? ? ?内部类MyAdapter继承RecylceView的ViewHolder。
? ? ? ? ?MyAdapter的构造方法
public MyAdapter(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.icon);
tv = itemView.findViewById(R.id.title);
}
? ? 首先调用其父类ViewHolder的构造方法,主要用来加载RecycleView的子布局,
public MyAdapter(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.icon);
tv = itemView.findViewById(R.id.title);
}
? ? ?之前我们在?onBindViewHolder()中设置数据,调用了MyAdapter的SetData()方法。
public void setData(ItemBean itemBean, int position) {
this.position = position;
tv.setText(itemBean.title);
imageView.setImageResource(itemBean.icon);
}
? ? 为获取的到的imageview和textview设置数据。
? 最后运行一下!!perfect,共勉!
<?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">
<ImageView
android:id="@+id/icon"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_margin="10dp"
android:scaleType="fitXY"
android:src="@mipmap/pic_01" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:layout_toRightOf="@+id/icon"
android:text="我是标题"
android:textSize="30sp" />
</LinearLayout>
先看一下RecylceView 的子布局。
|