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
1.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
1.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; } }
以上就是部分代码,其他的不重要的就没贴,希望对你有所帮助。你可以根据自己的情况修改上面的代码,要知道适合自己的才是最好的。