RecyclerView:
在安卓开发者网站上,对于RecyclerView的使用说明是:
如果您的应用需要根据大型数据集(或频繁更改的数据)显示元素的滚动列表,您应使用本页所述的 RecyclerView。
从表面上看,RecyclerView的作用和ListView类似,都是用来显示大量元素的,将元素以滚动的形式显示,但是RecyclerView 比 ListView 更高级且更具灵活性。它是一个用于显示庞大数据集的容器,可通过保持有限数量的视图进行非常有效的滚动操作。 如果您有数据集合,其中的元素将因用户操作或网络事件而在运行时发生改变,请使用 RecyclerView 。
从它类名上看,RecyclerView代表的意义是,我只管Recycler View,也就是说RecyclerView只管回收与复用View,其他的你可以自己去设置。可以看出其高度的解耦,给予你充分的定制自由(所以你才可以轻松的通过这个控件实现ListView,GirdView,瀑布流等效果)。
在ListView中 改变列表某一个item数据,然后刷新列表,会回到最顶部,而RecyclerView可以保持原来滑动的位置不变。
当然,说到 RecyclerView 的优点,就不得不提它的 插拔式 的体验,高度解耦:
布局(显示方式):可通过LayoutManager(LinearLayoutManagerGridLayoutManager,StaggeredGridLayoutManager
)设置; 分割线:通过 ItemDecoration 实现 Item 增删动画:通过 ItemAnimator ViewHolder
的创建和绑定:通过实现 Adapter
基础知识补充
LayoutManager:RecyclerView 会根据 Layout Manager
提供的视图来填充自身,常用的布局管理器有LinearLayoutManager(线性布局管理器)、GridLayoutManager(网格布局管理器)、StaggeredGridLayoutManager
(瀑布流布局管理器)等。 ViewHolder:列表中的视图由 ViewHolder 实例展示。 ViewHolder
用于对控件的实例进行缓存,负责显示子项。例如,如果列表显示了音乐集合,那么每个 ViewHolder 可能代表一个专辑。
Adapter:ViewHolder 对象由 Adapter 管理。Adapter 按需创建
ViewHolder,并为其绑定数据。绑定意味着根据 Adapter 中的位置为子视图填充对应的数据。
RecyclerView 的核心使用流程如下:
mRecyclerView = findView(R.id.id_recycler_view); //设置布局管理器
mRecyclerView.setLayoutManager(mLayoutManager); //设置adapter
mRecyclerView.setAdapter(mAdapter) //设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator()); //添加分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(
getActivity(), DividerItemDecoration.HORIZONTAL_LIST));
通过 RecyclerView 轻松实现一个普通列表:
首先创建一个recyclerview布局文件;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:fitsSystemWindows="true"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/collect_recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
再创建一个用于在recyclerview中显示的项,recycleritems;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="wrap_content"
android:padding="6dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/touxiangimg"
android:layout_width="50dp"
android:layout_height="50dp"
tools:srcCompat="@drawable/tab_find_frd_pressed" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="vertical">
<TextView
android:id="@+id/nametext"
android:layout_width="match_parent"
android:layout_height="25dp"
android:textSize="15dp"
android:text="TextView" />
<TextView
android:id="@+id/numbertext"
android:layout_width="match_parent"
android:layout_height="25dp"
android:textSize="15dp"
android:text="TextView" />
</LinearLayout>
</LinearLayout>
显示效果如下:
创建一个用于recycleritems的对象类FriendList;
import java.io.Serializable;
public class FriendList implements Serializable {
public String imgPath;//头像地址
public String FriendName;//朋友姓名
public String FriendNumber;//朋友电话
public FriendList(String imgPath, String FriendName, String FriendNumber) {
this.imgPath = imgPath;
this.FriendName = FriendName;
this.FriendNumber = FriendNumber;
}
public String getImgPath() {
return imgPath;
}
public void setImgPath(String imgPath) {
this.imgPath = imgPath;
}
public String getFriendName() {
return FriendName;
}
public void setFriendName(String FriendName) {
this.FriendName = FriendName;
}
public String getFriendNumber() {
return FriendNumber;
}
public void setFriendNumber(String FriendNumber) {
this.FriendNumber = FriendNumber;
}
@Override
public String toString() {
return "FriendList{" +
"imgPath='" + imgPath + '\'' +
", FriendName='" + FriendName + '\'' +
", FriendNumber='" + FriendNumber + '\'' +
'}';
}
}
创建recyclerview的适配器;
public class CollectRecycleAdapter extends RecyclerView.Adapter<CollectRecycleAdapter.myViewHodler> {
private Context context;
private ArrayList<FriendList> friendListList;
//创建构造函数
public CollectRecycleAdapter(Context context, ArrayList<FriendList> friendListList) {
//将传递过来的数据,赋值给本地变量
this.context = context;//上下文
this.friendListList = friendListList;//实体类数据ArrayList
}
/**
* 创建viewhodler,相当于listview中getview中的创建view和viewhodler
*
* @param parent
* @param viewType
* @return
*/
@Override
public myViewHodler onCreateViewHolder(ViewGroup parent, int viewType) {
//创建自定义布局
View itemView = View.inflate(context, R.layout.recycleritems, null);
return new myViewHodler(itemView);
}
/**
* 绑定数据,数据与view绑定
*
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(myViewHodler holder, int position) {
//根据点击位置绑定数据
FriendList data = friendListList.get(position);
//holder.mItemImg.setImageResource(R.drawable.mars2);
holder.mItemFriendName.setText(data.FriendName);//获取实体类中的name字段并设置
holder.mItemFriendNumber.setText(data.FriendNumber);//获取实体类中的price字段并设置
}
/**
* 得到总条数
*
* @return
*/
@Override
public int getItemCount() {
return friendListList.size();
}
//自定义viewhodler
class myViewHodler extends RecyclerView.ViewHolder {
private ImageView mItemImg;
private TextView mItemFriendName;
private TextView mItemFriendNumber;
public myViewHodler(View itemView) {
super(itemView);
mItemImg = (ImageView) itemView.findViewById(R.id.touxiangimg);
mItemFriendName = (TextView) itemView.findViewById(R.id.nametext);
mItemFriendNumber = (TextView) itemView.findViewById(R.id.numbertext);
//点击事件放在adapter中使用,也可以写个接口在activity中调用
//方法一:在adapter中设置点击事件
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//可以选择直接在本位置直接写业务处理
//Toast.makeText(context,"点击了xxx",Toast.LENGTH_SHORT).show();
//此处回传点击监听事件
if(onItemClickListener!=null){
onItemClickListener.OnItemClick(v, friendListList.get(getLayoutPosition()));
}
}
});
itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.OnItemLongClick(v, friendListList.get(getLayoutPosition()));
}
return true;
}
});
}
}
/**
* 设置item的监听事件的接口
*/
public interface OnItemClickListener {
/**
* 接口中的点击每一项的实现方法,参数自己定义
*
* @param view 点击的item的视图
* @param data 点击的item的数据
*/
void OnItemClick(View view, FriendList data);
void OnItemLongClick(View view, FriendList data);
}
//需要外部访问,所以需要设置set方法,方便调用
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
}
将recyclerview封装在fragment,调用Adapter中的方法;
public class LianxirenFragment extends Fragment {
private View view;//定义view用来设置fragment的layout
public RecyclerView mCollectRecyclerView;//定义RecyclerView
//定义以goodsentity实体类为对象的数据集合
private ArrayList<FriendList> friendLists = new ArrayList<FriendList>();
//自定义recyclerveiw的适配器
private CollectRecycleAdapter mCollectRecyclerAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//获取fragment的layout
view = inflater.inflate(R.layout.tab02, container, false);
//对recycleview进行配置
initRecyclerView();
//模拟数据
initData();
//CollectRecycleAdapter.initData();
return view;
}
/**
* TODO 模拟数据
*/
private void initData() {
for (int i=0;i<20;i++){
FriendList friendList =new FriendList("","","");
friendList.setImgPath("C:\\Users\\VULCAN\\AndroidStudioProjects\\MyWeChat\\app\\src\\main\\res\\drawable\\earth2.png");
friendList.setFriendName("name"+i);
friendList.setFriendNumber("10100"+i);
friendLists.add(friendList);
}
}
/**
* TODO 对recycleview进行配置
*/
private void initRecyclerView() {
//获取RecyclerView
mCollectRecyclerView=(RecyclerView)view.findViewById(R.id.collect_recyclerView);
//创建adapter
mCollectRecyclerAdapter = new CollectRecycleAdapter(getActivity(), friendLists);
//给RecyclerView设置adapter
mCollectRecyclerView.setAdapter(mCollectRecyclerAdapter);
//设置layoutManager,可以设置显示效果,是线性布局、grid布局,还是瀑布流布局
//参数是:上下文、列表方向(横向还是纵向)、是否倒叙
mCollectRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
//设置item的分割线
mCollectRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL));
//RecyclerView中没有item的监听事件,需要自己在适配器中写一个监听事件的接口。参数根据自定义
mCollectRecyclerAdapter.setOnItemClickListener(new CollectRecycleAdapter.OnItemClickListener() {
@Override
public void OnItemClick(View view, FriendList data) {
//此处进行监听事件的业务处理
Toast.makeText(getActivity(),"我是name",Toast.LENGTH_SHORT).show();
}
@Override
public void OnItemLongClick(View view,FriendList data){
Toast.makeText(getActivity(),"Long click"+data.getFriendNumber(),Toast.LENGTH_SHORT).show();
}
});
}}
到这里,在fragment里面实现recyclerview就基本结束了,你可以将配置好的fragment在mainactivility里面调用,在这里我是在之前写的类微信界面的项目中使用,可以在gitee上查看具体的代码。
代码地址
https://gitee.com/fyl253711android/Android_project.git