RecyclerView之初體驗
阿新 • • 發佈:2018-12-09
好久沒回歸我原生大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!完事!睡覺!!!