(Android View)Recyclerview分割線
4624 ワード
RecyclerViewの簡単な使い方は、まずRecyclerViewの使い方を振り返ってみましょう
私たちはRecyclerViewを使っているとき、これは分割線が全くなく、少し醜いように見えます.資料を調べてみると、グーグルはデフォルトの分割線を提供していません.次は分割線を作って、後でコピーして貼り付けるのに便利です.
1.xmlレイアウトを直接追加し、簡単で乱暴です.
2.カスタム分割線の使用
Googleのデフォルトでは提供されていないため、RecyclerViewを継承する必要があります.ItemDecorationで分割線をカスタマイズします.
先に書いたコードを貼ってから分析します.
まず気になるのがonDrawメソッド.コンストラクション関数に基づいて分割線の方向を決定します.drawHorizontalとdrawVerticalは、横item(縦線)と縦item(横線)をそれぞれ描画します.getItemOffsets()は、分割線のサイズを設定します.
呼び出し方はもっと簡単で、addItemDecorationメソッドでdivideのインスタンスを追加すればOKです.でも今日は穴を踏んだので、気をつけなければなりません.分割線をロードするには、setAdapterの前にしてください.覚えておいて!
私たちはRecyclerViewを使っているとき、これは分割線が全くなく、少し醜いように見えます.資料を調べてみると、グーグルはデフォルトの分割線を提供していません.次は分割線を作って、後でコピーして貼り付けるのに便利です.
1.xmlレイアウトを直接追加し、簡単で乱暴です.
2.カスタム分割線の使用
Googleのデフォルトでは提供されていないため、RecyclerViewを継承する必要があります.ItemDecorationで分割線をカスタマイズします.
先に書いたコードを貼ってから分析します.
/**
* :
* :2018/3/18
* :[email protected]
*/
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
public static final int HORIZONTAL = LinearLayoutManager.HORIZONTAL;
public static final int VERTICAL = LinearLayoutManager.VERTICAL;
private Drawable mDivider;
private int mOrientation;
private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
public DividerItemDecoration(Context context, int orientation) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
a.recycle();
setOrientation(orientation);
}
public void setOrientation(int orientation) {
if (orientation != HORIZONTAL && orientation != VERTICAL) {
}
mOrientation = orientation;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
if (mOrientation == VERTICAL) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}
/**
* ,
*
* @param c
* @param parent
*/
public void drawVertical(Canvas c, RecyclerView parent) {
/* orientation Vertical ,Item
Top Bottom Item
Item child */
// =item
final int left = parent.getPaddingLeft();
// = + width
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
//Top = child + child
final int top = child.getBottom() + params.bottomMargin;
// bottom = top +
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
/**
* ,
*
* @param c
* @param parent
*/
public void drawHorizontal(Canvas c, RecyclerView parent) {
/* orientation Horizontal ,Item
Top Bottom
left right Item
Item child */
final int top = parent.getPaddingTop();
final int bottom = parent.getHeight() - parent.getPaddingBottom();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
// left = child + child
final int left = child.getRight() + params.rightMargin;
// +
final int right = left + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
/* outRect.set(left, top, right, bottom);
Item
,Item
,Item */
if (mOrientation == VERTICAL) {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
}
まず気になるのがonDrawメソッド.コンストラクション関数に基づいて分割線の方向を決定します.drawHorizontalとdrawVerticalは、横item(縦線)と縦item(横線)をそれぞれ描画します.getItemOffsets()は、分割線のサイズを設定します.
呼び出し方はもっと簡単で、addItemDecorationメソッドでdivideのインスタンスを追加すればOKです.でも今日は穴を踏んだので、気をつけなければなりません.分割線をロードするには、setAdapterの前にしてください.覚えておいて!
DividerItemDecoration dividerItemDecoration=new DividerItemDecoration(getInstance().getActivity(), DividerItemDecoration.VERTICAL);
recycler_sensor_list.addItemDecoration( dividerItemDecoration);