1. 程式人生 > >RecyclerView之初體驗

RecyclerView之初體驗

好久沒回歸我原生大Android開發啦!甚是懷念啊!終於,公司最近來了一個原生專案,可以好好爽一把了!實不相瞞,我現在寫列表還是用的ListView   - -! 想想以前用的那些東西,是該換換了!早就想用RecyclerView了,一直沒機會!哎~~~網路框架就看了一下OkGo。然後!!大換血!!!

這回閒下來了,好好學一學RecyclerView的基本使用了,先能實現個普通列表開發就行! 哈哈~~~

使用RecyclerView的好處,想必你們這些大佬早就一清二楚了!我也查了相關帖子,也就不贅述了!

初始化

        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
//        recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
        recyclerView.addItemDecoration(new ItemDecoration(this, R.drawable.divider_line, 1));
        adapter = new MyAdapter(this);
        adapter.openLoadAnimation();
//        adapter.isFirstOnly(false);

        recyclerView.setAdapter(adapter);

這裡的adapter,我用了一個庫,叫BRVAH,GitHub上一搜就能找到,start也很高~~ 從此,媽媽再也不用擔心我寫adapter了!

public class MyAdapter extends BaseQuickAdapter<ClassListBean.DataBean, BaseViewHolder> {
    private Context context;

    public MyAdapter(Context context) {
        super(R.layout.item);
        this.context = context;
    }

    @Override
    protected void convert(BaseViewHolder helper, ClassListBean.DataBean item) {

//        helper.setGone(R.id.tv_mirror, helper.getLayoutPosition() - getHeaderLayoutCount() == 0);

        Picasso.with(context).load(item.getPicBig()).into((ImageView) helper.getView(R.id.iv_avatar));
        helper.setText(R.id.tv_title, item.getName());
        helper.setText(R.id.tv_desc, item.getDescription());
        helper.setText(R.id.tv_num, "當前學員數:" + item.getLearner());
        helper.addOnClickListener(R.id.iv_avatar).addOnClickListener(R.id.tv_title);
    }
}

用了這個庫,寫個adapter,簡直不要太粗暴!幾行就搞定!!而且這個庫還有更高階的用法,大佬們自行去看吧!

用了RecyclerView,唯獨的一點弱地方,就是分割線和item的點選事件了!

先說點選事件,上面這個庫已經完美解決了!

        //普通點選事件
        adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                showToast(position + "");
            }
        });
        //子view點選事件
        adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
                ClassListBean.DataBean b = (ClassListBean.DataBean) adapter.getItem(position);
                switch (view.getId()) {
                    case R.id.iv_avatar:
                        showToast(b.getPicBig());
                        break;
                    case R.id.tv_title:
                        showToast(b.getName());
                        break;
                }
            }
        });

再說分割線!話不多說,放類!


/**
 * RecyclerView分割線(適用於縱向列表和網格佈局,橫向列表忽略)
 */
public class ItemDecoration extends RecyclerView.ItemDecoration {
    private Drawable mDivider;
    private int style;

    /**
     * resId自定義,style  1:垂直列表分割線  2:網格佈局分割線
     */
    public ItemDecoration(Context context, int resId, int style) {
        mDivider = context.getResources().getDrawable(resId);
        this.style = style;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        if (style == 1) {
            drawListVertical(c, parent);
        }
        if (style == 2) {
            drawHorizontal(c, parent);
            drawGridVertical(c, parent);
        }
    }

    private int getSpanCount(RecyclerView parent) {
        int spanCount = -1;// 列數
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager) {
            spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
        } else if (layoutManager instanceof StaggeredGridLayoutManager) {
            spanCount = ((StaggeredGridLayoutManager) layoutManager).getSpanCount();
        }
        return spanCount;
    }

    public void drawListVertical(Canvas c, RecyclerView parent) {
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
//            if (i == childCount - 1) {//最後一項底部是否設定線,顯示這一塊程式碼就不設定
//                return;
//            }
            View child = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            int top = child.getBottom() + params.bottomMargin;
            int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    public void drawHorizontal(Canvas c, RecyclerView parent) {
        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            int top = parent.getChildAt(i).getTop() - mDivider.getIntrinsicHeight();
            int bottom = parent.getChildAt(i).getBottom();
            int left = child.getRight() + params.leftMargin;
            int right = left + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    public void drawGridVertical(Canvas c, RecyclerView parent) {
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            int left = parent.getChildAt(i).getLeft() + params.leftMargin;
            int right = parent.getChildAt(i).getRight() + params.rightMargin;
            int top = child.getBottom() + params.bottomMargin;
            int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) {
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager) {
            if ((pos + 1) % spanCount == 0) {// 如果是最後一列,則不需要繪製右邊
                return true;
            }
        } else if (layoutManager instanceof StaggeredGridLayoutManager) {
            int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation();
            if (orientation == StaggeredGridLayoutManager.VERTICAL) {
                if ((pos + 1) % spanCount == 0) {// 如果是最後一列,則不需要繪製右邊
                    return true;
                }
            } else {
                childCount = childCount - childCount % spanCount;
                if (pos >= childCount)// 如果是最後一列,則不需要繪製右邊
                    return true;
            }
        }
        return false;
    }

    private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) {
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager) {
            childCount = childCount - childCount % spanCount;
            if (pos >= childCount)// 如果是最後一行,則不需要繪製底部
                return true;
        } else if (layoutManager instanceof StaggeredGridLayoutManager) {
            int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation();
            // StaggeredGridLayoutManager 且縱向滾動
            if (orientation == StaggeredGridLayoutManager.VERTICAL) {
                childCount = childCount - childCount % spanCount;
                // 如果是最後一行,則不需要繪製底部
                if (pos >= childCount)
                    return true;
            } else {
                // StaggeredGridLayoutManager 且橫向滾動
                // 如果是最後一行,則不需要繪製底部
                if ((pos + 1) % spanCount == 0) {
                    return true;
                }
            }
        }
        return false;
    }

    @Override
    public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
        int spanCount = getSpanCount(parent);
        int childCount = parent.getAdapter().getItemCount();
        if (isLastRaw(parent, itemPosition, spanCount, childCount)) {// 如果是最後一行,則不需要繪製底部
            outRect.set(0, 0, mDivider.getIntrinsicHeight(), 0);
        } else if (isLastColum(parent, itemPosition, spanCount, childCount)) {// 如果是最後一列,則不需要繪製右邊
            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
        } else {
            outRect.set(0, 0, mDivider.getIntrinsicHeight(), mDivider.getIntrinsicHeight());
        }
    }
}

在初始化的地方,我已經設定了分割線,分割線的樣式,可以自己定義:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#ccc"/>
    <size android:height="1px"/>
</shape>

OK!完事!睡覺!!!