記錄下Android RecyclerView的使用

       RecyclerView 是從Android5.0開始加入進來用來代替ListView的一種列表式控件,它的在功能上比listview更爲強大,支持豎滑流,橫滑流,瀑布流等幾種風格,並且區別於listview的Adapter,有自己單獨的適配器,支持ViewHolder的使用,在這方面的優化也不是listView能夠比擬的,也難怪能在短暫的時間內迅速代替listView成爲開發者手中的香饃饃。

       這裏我記錄下我重寫ViewHolder和Adapter和使用RecyclerView的流程,方便以後的工作中做參考:

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章