实验二: Recycleview基本使用
实验目标和实验内容:
1、掌握UI设计中的layout布局(约束布局)与基本控件(button、text、imageview等); 2、掌握复杂控件与adapter的使用
在使用RecyclerView时候,必须指定一个适配器Adapter和一个布局管理器LayoutManager。 我们这样思考,当我们去完成一个界面的布局时,我们要向里面传数据,怎么去传呢?全写在xml文件里显而不合适,这就是Adapter的作用。 简而言之,Adapter就是数据与ui之间的桥梁,它把数据与前端ui连接到一起,是一个展示数据的载体。 而设置布局管理器RecyclerView则是来控制Item的布局方式,横向、竖向以及瀑布流方式 例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还StaggeredGridLayoutManager等)。也就是说RecyclerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。 下面我们展示RecyclerView的基本使用方法:
代码语言:javascript复制recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(this );
//设置布局管理器
recyclerView.setLayoutManager(layoutManager);
//设置为垂直布局,这也是默认的
layoutManager.setOrientation(OrientationHelper. VERTICAL);
//设置Adapter
recyclerView.setAdapter(recycleAdapter);
//设置分隔线
recyclerView.addItemDecoration( new DividerGridItemDecoration(this ));
//设置增加或删除条目的动画
recyclerView.setItemAnimator( new DefaultItemAnimator());
接下来就开始完善之前的Demo吧 首先添加RecycleView的依赖 在build.gradle(Module:app)文件中添加如下依赖:
代码语言:javascript复制dependencies {
implementation 'com.android.support:recyclerview-v7:30.0.0'
}
复制代码 其中v7:后面的版本号与此文件下 compileSdkVersion后所跟数字相同,如下图所示
修改原有xml文件 为了实现RecyclerView,我们将初始的xml文件修改为ConstrainLayout(约束布局)并添加RecyclerView 代码如下:
代码语言: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/tab02_RecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
android:layout_margin="8dp"
android:overScrollMode="never"
android:scrollbars="none" />
将微信fragment的布局改为recycleView布局 现在需要将 RecyclerView 添加到上次的微信fragment对应的布局文件中。使用 RecyclerView 作为整个布局的唯一视图:
代码语言:javascript复制<?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"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<!-- <TextView-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"-->
<!-- android:gravity="center"-->
<!-- android:text="这是微信聊天界面"-->
<!-- android:textSize="30sp"-->
<!-- android:textStyle="bold"/>-->
<androidx.recyclerview.widget.RecyclerView
android:id="@ id/weixin_recycler_view"
android:layout_width="match_parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_height="wrap_content"/>
</LinearLayout>
在布局中添加了 weixinRecycleViewAdapter 微件之后,需要获取对象句柄,将其连接到布局管理器,并为要显示的数据附加适配器
创建适配器实现步骤如下:
- ① 创建Adapter:创建一个继承RecyclerView.Adapter的Adapter类
- ② 创建ViewHolder:在Adapter中创建一个继承RecyclerView.ViewHolder的静态内部类。
- ③ 在Adapter中实现3个方法: onCreateViewHolder() 这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder就是前面的那个静态内部类的实例 2. onBindViewHolder() 这个方法主要用于适配渲染数据到View中。方法提供给你了一viewHolder而不是原来的convertView 3. getItemCount() 这个方法就类似于BaseAdapter的getCount方法了,即总共有多少个条目。 在这里,补充一个知识点,关于RecyclerView的调用顺序总是按照: 获取大小——>绑定布局——>加载ViewHolder类——>绑定数据 这样一个规律的,通过这样的规律,我们就能知道是按照怎样的顺序来调用这些重载函数的了。 代码如下:
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class VerticalAdapter extends RecyclerView.Adapter<VerticalAdapter.VerticalViewHolder> {
private Context mContext;
private List<String> mList;
public VerticalAdapter(List<String> list, Context context) {
mList = list;
mContext = context;
}
@NonNull
@Override
public VerticalAdapter.VerticalViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(this.mContext).inflate(R.layout.item02, parent, false);
return new VerticalViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull VerticalViewHolder holder, int position) {
holder.tvNum.setText(position 1 "");
holder.tvContent.setText(mList.get(position));
}
@Override
public int getItemCount() {
return mList == null ? 0 : mList.size();
}
public static class VerticalViewHolder extends RecyclerView.ViewHolder {
TextView tvNum, tvContent;
public VerticalViewHolder(View itemView) {
super(itemView);
tvNum = itemView.findViewById(R.id.item02_num);
tvContent = itemView.findViewById(R.id.item02_content);
}
}
}
实验结果:(实验小结与结果截图)
实验小结 1.使用RecycleView开发必须初始化LinearLayoutManager:recyclerView.setLayoutManager(linearLayoutManager); 2.使用RecycleView时适配器要继承 RecyclerView.Adapter<RecyclerView.ViewHolder>,adapter中必须实现3个方法:
- ① onCreateViewHolder 初始化要加载的布局
- ② onBindViewHolder 来加载数据
- ③ getItemCount 得到数据源的大小
3.和ListView一样使用RecycelView嵌套在scrollView里面的时候也会存在一些问题,recycleView嵌套在scrollview里面会不能展示数据