Android应用开发中RecyclerView组件使用入门教程

2019-12-10 18:59:34王振洲

(1)onCreateViewHolder创建ViewHolder.

(2)onBindViewHolder绑定每一项数据.

(3)getItemCount返回列表长度.

(4)RecyclerView强制使用ViewHolder.

public class MyViewHolder extends RecyclerView.ViewHolder {

 private TextView mTvLabel; // 标签
 private TextView mTvDateTime; // 日期

 public MyViewHolder(View itemView) {
  super(itemView);
  mTvLabel = (TextView) itemView.findViewById(R.id.item_text);
  mTvDateTime = (TextView) itemView.findViewById(R.id.item_date);
 }

 public TextView getTvLabel() {
  return mTvLabel;
 }

 public TextView getTvDateTime() {
  return mTvDateTime;
 }

}

在onCreateViewHolder方法, 创建类; 在onBindViewHolder方法, 绑定数据.
DataModel

public class DataModel {

 private String mLabel;
 private Date mDateTime;

 public String getLabel() {
  return mLabel;
 }

 public void setLabel(String label) {
  mLabel = label;
 }

 public Date getDateTime() {
  return mDateTime;
 }

 public void setDateTime(Date dateTime) {
  mDateTime = dateTime;
 }
}

6. ItemDecoration
项的装饰, 比如ListView中的分割线, 在本例中, 左右两条粉线.

 private void initItemDecoration(RecyclerView recyclerView) {
  recyclerView.addItemDecoration(new MyItemDecoration(this));
 }

ItemDecoration, 注意parent和child的使用方式.

public class MyItemDecoration extends RecyclerView.ItemDecoration {

 private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
 private Drawable mDivider;

 public MyItemDecoration(Context context) {
  final TypedArray array = context.obtainStyledAttributes(ATTRS);
  mDivider = array.getDrawable(0);
  array.recycle();
 }

 @Override
 public void onDraw(Canvas c, RecyclerView parent, State state) {
  drawHorizontal(c, parent);
  drawVertical(c, parent);
 }

 // 水平线
 public void drawHorizontal(Canvas c, RecyclerView parent) {

  final int childCount = parent.getChildCount();

  // 在每一个子控件的底部画线
  for (int i = 0; i < childCount; i++) {
   final View child = parent.getChildAt(i);

   final int left = child.getLeft() + child.getPaddingLeft();
   final int right = child.getWidth() + child.getLeft() - child.getPaddingRight();
   final int top = child.getBottom() - mDivider.getIntrinsicHeight() - child.getPaddingBottom();
   final int bottom = top + mDivider.getIntrinsicHeight();
   mDivider.setBounds(left, top, right, bottom);
   mDivider.draw(c);
  }
 }

 // 竖直线
 public void drawVertical(Canvas c, RecyclerView parent) {

  final int childCount = parent.getChildCount();

  // 在每一个子控件的右侧画线
  for (int i = 0; i < childCount; i++) {
   final View child = parent.getChildAt(i);
   int right = child.getRight() - child.getPaddingRight();
   int left = right - mDivider.getIntrinsicWidth();
   final int top = child.getTop() + child.getPaddingTop();
   final int bottom = child.getTop() + child.getHeight() - child.getPaddingBottom();

   mDivider.setBounds(left, top, right, bottom);
   mDivider.draw(c);
  }
 }

 // Item之间的留白
 @Override
 public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {
  outRect.set(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight());
 }
}