RecyclerView介绍
RecyclerView 是作为 ListView 和 GridView 的加强版出现的,目的是在有限的屏幕之上展示大量的内容,因此 RecyclerView 的复用机制的实现是它的一个核心部分,复用机制可以显著提高性能,改善应用响应能力并降低功耗。
注意: RecyclerView 除了是类的名称,也是库的名称。RecyclerView 始终表示 RecyclerView 库中的类。
专业术语
- Adapter:RecyclerView.Adapter负责提供表示数据集中项目的视图的子类。
- Position:数据项在Adapter 中的位置。
- Index:在调用中使用的附加子视图的索引 ViewGroup.getChildAt(int)。与位置相对。
- Binding:准备子视图以显示与适配器内某个位置对应的数据的过程。
- Recycle(view):Recycler 负责管理报废或分离的项目视图以供重用。
- Scrap(view):在布局过程中进入临时分离状态的子视图。废弃视图可以被重用,而不会与父 RecyclerView 完全分离,如果不需要重新绑定则不修改,或者如果视图被认为是脏的,则由适配器修改。
- Dirty(view):必须由适配器重新绑定才能显示的子视图。
常用方法
- setLayoutManager:必选项,设置 RecyclerView 的布局管理器,决定RecyclerView 的显示风格。常用的有线性布局管理器(LinearLayoutManager)、网格布局管理器(GridLayoutManager)、瀑布流布局管理器(StaggeredGridLayoutManager)。
- setAdapter:必选项,设置 RecyclerView 的数据适配器。当数据发生改变时,以通知者的身份,通知 RecyclerView 数据改变进行列表刷新操作。
- addItemDecoration:非必选项,设置 RecyclerView中 Item 的装饰器,经常用来设置 Item 的分割线。
- setItemAnimator:非必选项,设置 RecyclerView中 Item 的动画。
定义Adapter
你需要替换三个关键方法:
- onCreateViewHolder():每当 RecyclerView 需要创建新的 ViewHolder 时,它都会调用此方法。此方法会创建并初始化 ViewHolder 及其关联的 View,但不会填充视图的内容,因为 ViewHolder 此时尚未绑定到具体数据。
- onBindViewHolder():RecyclerView 调用此方法将 ViewHolder 与数据相关联。此方法会提取适当的数据,并使用该数据填充 ViewHolder 的布局。例如,如果 RecyclerView 显示的是一个名称列表,该方法可能会在列表中查找适当的名称,并填充 ViewHolder 的 TextView widget。
- getItemCount():RecyclerView 调用此方法来获取数据集的大小。例如,在通讯簿应用中,这可能是地址总数。RecyclerView 使用此方法来确定什么时候没有更多的列表项可以显示。
实例
效果图
代码实现
RecyclerViewActivity
public class RecyclerViewActivity extends ActivityBase{
ActivityRecyclerviewBinding recyclerviewBinding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
recyclerviewBinding = ActivityRecyclerviewBinding.inflate(getLayoutInflater());
setContentView(recyclerviewBinding.getRoot());
LinearLayoutManager llManager = new LinearLayoutManager(this);
//默认垂直展示,这里设置为水平显示
llManager.setOrientation(LinearLayoutManager.HORIZONTAL);
//设置 RecyclerView 的布局管理器
recyclerviewBinding.rvUserinfo.setLayoutManager(llManager);
List<UserInfo> userList = new ArrayList<>();
userList.add(new UserInfo("苏妲己", R.mipmap.scc_1));
...
userList.add(new UserInfo("王昭君", R.mipmap.scc_7));
BaseRecyclerAdapter<UserInfo> adapter = new BaseRecyclerAdapter<UserInfo>(this,userList) {
@Override
public int getItemLayoutId(int viewType) {
return R.layout.item_rv_userinfo;
}
@Override
public void convert(RecyclerViewHolder holder, int position, UserInfo bean) {
holder.setText(R.id.tv_name,bean.getName());
holder.setText(R.id.tv_content,bean.getContent());
holder.setImageResource(R.id.iv_head,bean.getHead());
}
};
//设置 RecyclerView 的数据适配器。
recyclerviewBinding.rvUserinfo.setAdapter(adapter);
//addItemDecoration
recyclerviewBinding.rvUserinfo.addItemDecoration(new RvDividerItemDecoration(this,10));
}
}
activity_recyclerview.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_userinfo"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
item_rv_userinfo.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="match_parent">
<ImageView
android:id="@+id/iv_head"
.../>
<TextView
android:id="@+id/tv_name"
.../>
<TextView
android:id="@+id/tv_content"
.../>
</RelativeLayout>
BaseRecyclerAdapter
public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerViewHolder> {
protected final List<T> mData;
protected final Context mContext;
protected LayoutInflater mInflater;
private OnItemClickListener mClickListener;
private OnItemLongClickListener mLongClickListener;
public BaseRecyclerAdapter(Context ctx, List<T> list) {
mData = (list != null) ? list : new ArrayList<T>();
mContext = ctx;
mInflater = LayoutInflater.from(ctx);
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
////创建一个新视图,该视图定义item的UI
final RecyclerViewHolder holder = new RecyclerViewHolder(mContext,
mInflater.inflate(getItemLayoutId(viewType), parent, false));
if (mClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mClickListener.onItemClick(holder.itemView, holder.getLayoutPosition());
}
});
}
if (mLongClickListener != null) {
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mLongClickListener.onItemLongClick(holder.itemView, holder.getLayoutPosition());
return true;
}
});
}
return holder;
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
convert(holder, position, mData.get(position));
}
@Override
public int getItemCount() {
return mData.size();
}
public void add(int pos, T item) {
mData.add(pos, item);
notifyItemInserted(pos);
}
public void delete(int pos) {
mData.remove(pos);
notifyItemRemoved(pos);
}
public void setOnItemClickListener(OnItemClickListener listener) {
mClickListener = listener;
}
public void setOnItemLongClickListener(OnItemLongClickListener listener) {
mLongClickListener = listener;
}
abstract public int getItemLayoutId(int viewType);
abstract public void convert(RecyclerViewHolder holder, int position, T bean);
public interface OnItemClickListener {
public void onItemClick(View itemView, int pos);
}
public interface OnItemLongClickListener {
public void onItemLongClick(View itemView, int pos);
}
}
RecyclerViewHolder
public class RecyclerViewHolder extends RecyclerView.ViewHolder {
private SparseArray<View> mViews;//集合类,layout里包含的View,以view的id作为key,value是view对象
private Context mContext;//上下文对象
public RecyclerViewHolder(Context ctx, View itemView) {
super(itemView);
mContext = ctx;
mViews = new SparseArray<View>();
}
private <T extends View> T findViewById(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = itemView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
public View getView(int viewId) {
return findViewById(viewId);
}
public TextView getTextView(int viewId) {
return (TextView) getView(viewId);
}
public Button getButton(int viewId) {
return (Button) getView(viewId);
}
public ImageView getImageView(int viewId) {
return (ImageView) getView(viewId);
}
public ImageButton getImageButton(int viewId) {
return (ImageButton) getView(viewId);
}
public EditText getEditText(int viewId) {
return (EditText) getView(viewId);
}
public RecyclerViewHolder setText(int viewId, String value) {
TextView view = findViewById(viewId);
view.setText(MStringUtils.isNullOrEmpty(value) ? "" : value);
return this;
}
public RecyclerViewHolder setVisible(int viewId, int visible) {
View view = findViewById(viewId);
view.setVisibility(visible);
return this;
}
public RecyclerViewHolder setBackground(int viewId, int resId) {
View view = findViewById(viewId);
view.setBackgroundResource(resId);
return this;
}
public RecyclerViewHolder setImageResource(int viewId, int resId) {
ImageView view = findViewById(viewId);
view.setImageResource(resId);
return this;
}
public RecyclerViewHolder setClickListener(int viewId, View.OnClickListener listener) {
View view = findViewById(viewId);
view.setOnClickListener(listener);
return this;
}
}
XRecyclerView
一个 RecyclerView 实现了 pullrefresh 、loadingmore 和 header featrues。你可以像标准的 RecyclerView 一样使用它。 你不需要实现一个特殊的适配器。
上面了解到了RecyclerView的简单使用,下面咱来看看其源码。比较现在要求较高不能光会用还得知道其原理。
以上就是本文的全部内容啦,希望对你有所帮助。