RecyclerView 是从Android5.0开始加入进来用来代替ListView的一种列表式控件,它的在功能上比listview更为强大,支持竖滑流,横滑流,瀑布流等几种风格,并且区别于listview的Adapter,有自己单独的适配器,支持ViewHolder的使用,在这方面的优化也不是listView能够比拟的,也难怪能在短暂的时间内迅速代替listView成为开发者手中的香馍馍。
这里我记录下我重写ViewHolder和Adapter和使用RecyclerView的流程,方便以后的工作中做参考:
- 重写RecyclerView的ViewHolder类,为以后打基础
public class CommRecyclerViewHolder extends RecyclerView.ViewHolder {
private SparseArray<View> mViews;
private Context mContext;
private View mConvertView;
public CommRecyclerViewHolder(Context context, View itemView) {
super(itemView);
mContext = context;
mConvertView = itemView;
mViews = new SparseArray<View>();
}
public CommRecyclerViewHolder(Context context, View itemView, ViewGroup parent) {
super(itemView);
mContext = context;
mConvertView = itemView;
mViews = new SparseArray<>();
}
public static CommRecyclerViewHolder get(Context context, View itemView) {
CommRecyclerViewHolder holder = new CommRecyclerViewHolder(context, itemView);
return holder;
}
public static CommRecyclerViewHolder get(Context context, ViewGroup parent, int
layoutId) {
View itemView = LayoutInflater.from(context).inflate(layoutId, parent, false);
CommRecyclerViewHolder viewHolder = new CommRecyclerViewHolder(context, itemView,
parent);
return viewHolder;
}
public View getmConvertView() {
return mConvertView;
}
public Context getContext() {
return mContext;
}
public <T extends View> T getView(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = mConvertView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
public CommRecyclerViewHolder setText(int viewId, String text) {
TextView tv = getView(viewId);
tv.setText(text);
return this;
}
public CommRecyclerViewHolder setText(int viewId, Spanned text) {
TextView tv = getView(viewId);
tv.setText(text);
return this;
}
public CommRecyclerViewHolder setImageResource(int viewId, int resId) {
ImageView view = getView(viewId);
view.setImageResource(resId);
return this;
}
public CommRecyclerViewHolder setOnClickListener(int viewId,
View.OnClickListener listener) {
View view = getView(viewId);
view.setOnClickListener(listener);
return this;
}
public CommRecyclerViewHolder setOnLongClickListener(int viewId,
View.OnLongClickListener listener) {
View view = getView(viewId);
view.setOnLongClickListener(listener);
return this;
}
public void setVisible(int viewId, boolean visible) {
View view = getView(viewId);
view.setVisibility(visible ? View.VISIBLE : View.GONE);
}
public TextView getTextView(int viewId){
return getView(viewId);
}
public ImageView getImageView(int viewId){
return getView(viewId);
}
public RelativeLayout getReltiveLayout(int viewId){
return getView(viewId);
}
}
2.重写RecyclerVIew的Adapter类,为后期打基础
public abstract class CommRecyclerViewAdapter<T> extends RecyclerView.Adapter<CommRecyclerViewHolder> {
protected LayoutInflater mInflater;
protected Context mContext;
protected List<T> mDatas = null;
protected final int mItemLayoutId;
public CommRecyclerViewAdapter(Context context, List<T> data, int itemLayoutId) {
mContext = context;
mDatas = data != null ? data : new ArrayList<>();
mItemLayoutId = itemLayoutId;
mInflater = LayoutInflater.from(context);
}
@Override
public CommRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
CommRecyclerViewHolder viewHolder = CommRecyclerViewHolder.get(mContext, parent, mItemLayoutId);
return viewHolder;
}
@Override
public void onBindViewHolder(CommRecyclerViewHolder holder, int position) {
try {
convert(holder, mDatas.get(position));
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
convert(holder, null);
}
}
@Override
public int getItemCount() {
return mDatas.size();
}
public abstract void convert(CommRecyclerViewHolder holder, T t);
}
3.写好基类后创建自定义的Adapter继承基类Adapter,这块各有各的不同就不写出来了。
4.在Activity中初始化RecyclerView,画分割线,这里和ListView有点不同,RecyclerView有单独的画分割线的方法,不用在列表每一项下面划线。
DividerItemDecoration decoration = new DividerItemDecoration();
decoration.setDividerLookup(new DividerItemDecoration.DividerLookup() {
@Override
public Divider getVerticalDivider(int position) {
return null;
}
@Override
public Divider getHorizontalDivider(int position) {
return new Divider.Builder().size(dp2px(0.5f)).margleft(dp2px(20))
.color(getResources().getColor(R.color.witer)).build();
}
});
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.addItemDecoration(decoration);
其中new Divider.Builder().size()方法是分割线的粗细,dp2px()方法是转化下单位这里面使用的类是用的Android 28里面的,margleft()方法是离左边的距离,有左自然有右没写,color()方法是分割线的颜色
public static int dp2px( float dpVal) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, getContext().getResources().getDisplayMetrics());
}
5.最后用setAdapter方法将RecyclerVIew和Adapter连接起来
recyclerView.setAdapter(adapter);
以上就是我对RecyclerView的封装和使用,是不是很简单,记录下。