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的封裝和使用,是不是很簡單,記錄下。