Android UI RecycleView用法

34 篇文章 0 订阅
Android UI RecycleView用法
RecycleView描述

RecycleView是在有限的窗口中大量显示数据集的灵活view,类似ListView,GridView

RecycleView特点
  1. ListView的功能(包括横向)
  2. GridView的功能
  3. 横向ScrollView
  4. 瀑布流
  5. Item方便添加Animation(添加或删除)
RecycleView常规使用
  1. gradle配置
api 'com.android.support:recyclerview-v7:28.0.0'
  1. BaseRecycleAct.java
public class BaseRecycleAct extends Activity {

    private RecyclerView recycler;
    // 适配器数据
    private List<String> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.base_recycleview);
        recycler = findViewById(R.id.recycler);
        // 必须设置布局管理器(线性布局)
        recycler.setLayoutManager(new LinearLayoutManager(this));
        initData();
        // 实例化并传输数据给adapter
        TestRecycleViewAdapter adapter = new TestRecycleViewAdapter(getApplicationContext(), list);
        // 设置RecycleView的Adapter,必须
        recycler.setAdapter(adapter);

        // 设置分割线,非必须
//        recycler.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
//        recycler.addItemDecoration(new CustomDecoration(this, CustomDecoration.VERTICAL_LIST, R.drawable.divider_bg, 0));
		......
        // 设置item的增删动画,非必须
//        recycler.setItemAnimator......

    }

    /**
     * 添加数据
     */
    private void initData() {
        list = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            list.add("item" + i);
        }
    }
}
  1. TestRecycleViewAdapter.java
public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.ViewHolderA> {

    private Context mContext;

    private List<String> mList;

    public RecycleAdapter(Context app, List<String> list) {
        this.mContext = app;
        this.mList = list;
    }

    @NonNull
    @Override
    public ViewHolderA onCreateViewHolder(@NonNull ViewGroup parent, int i) {
        // 此处动态加载ViewHolder的布局文件并返回holder
        View view = LayoutInflater.from(mContext)
                .inflate(R.layout.recycleview_item, parent, false);
        return new ViewHolderA(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolderA holder, int position) {
        // 此处设置Item中view的数据
        holder.mTextView.setText(mList.get(position));
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    class ViewHolderA extends RecyclerView.ViewHolder {

        public TextView mTextView;

        public ViewHolderA(@NonNull View itemView) {
            super(itemView);
            mTextView = itemView.findViewById(R.id.recycle_textview);
        }
    }

}
  1. RecycleView展示布局及 单个Item布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:id="@+id/recycler"
        android:layout_height="match_parent"/>

</android.support.constraint.ConstraintLayout>

// 单个Item布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:orientation="vertical">

    <TextView xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/recycle_textview"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:gravity="center"
        android:textSize="20sp" />
</LinearLayout>

做完上面4步,RecycleView算是基本入门了,当然还有高级用法我们需要继续了解

  1. 如果我们需要RecycleView展示Scrollbars,加一行
// android:scrollbars
<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:id="@+id/recycler"
        android:scrollbars="vertical"
        android:layout_height="match_parent"/>
  1. 设置Item分割线
recycler
.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));

也可以自定义分割线

public class CustomDecoration extends RecyclerView.ItemDecoration {
    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
    private Drawable mDivider;
    private int mOrientation;
    // 分割线缩进值
    private int inset;

    private Paint paint;

    /**
     * @param context
     * @param orientation layout的方向
     * @param drawable    引入的drawable的ID
     * @param inset       分割线缩进值
     */
    public CustomDecoration(Context context, int orientation, int drawable, int inset) {
        mDivider = context.getResources().getDrawable(drawable);
        this.inset = inset;
        paint = new Paint();
        paint.setColor(context.getResources().getColor(R.color.white));
        paint.setStyle(Paint.Style.FILL);
        paint.setAntiAlias(true);
        setOrientation(orientation);
    }

    public void setOrientation(int orientation) {
        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
            throw new IllegalArgumentException("invalid orientation");
        }
        mOrientation = orientation;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent) {
        if (mOrientation == VERTICAL_LIST) {
            drawVertical(c, parent);
        } else {
            drawHorizontal(c, parent);
        }
    }

    private void drawVertical(Canvas c, RecyclerView parent) {
        final int left = parent.getPaddingLeft();
        final int right = parent.getWidth() - parent.getPaddingRight();

        final int childCount = parent.getChildCount();
        // 最后一个item不画分割线
        for (int i = 0; i < childCount - 1; i++) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            final int top = child.getBottom() + params.bottomMargin;
            final int bottom = top + mDivider.getIntrinsicHeight();
            if (inset > 0) {
                c.drawRect(left, top, right, bottom, paint);
                mDivider.setBounds(left + inset, top, right - inset, bottom);
            } else {
                mDivider.setBounds(left, top, right, bottom);
            }
            mDivider.draw(c);
        }
    }

    private void drawHorizontal(Canvas c, RecyclerView parent) {
        final int top = parent.getPaddingTop();
        final int bottom = parent.getHeight() - parent.getPaddingBottom();

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

    // 由于Divider也有宽高,每一个Item需要向下或者向右偏移
    @Override
    public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
        if (mOrientation == VERTICAL_LIST) {
            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
        } else {
            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
        }
    }
}
  1. drawable中divider_bg.xml 可以解注释 步骤1中代码进行测试
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:centerColor="#b3b35f"
        android:endColor="#515187"
        android:startColor="#b34747"
        android:type="linear" />
    <size android:height="5dp"/>
</shape>
  1. 后续会另写一篇采用IoC注解实现RecycleView单Item点击或长按事件的文章

参考文献

  1. RecyclerView从入门到深入
  2. UI系列 02:(一)RecycleView入门
  3. 判断RecyclerView是否滚动到底部
  4. 为 RecyclerView 的列表条目 item 添加动画
  5. 自定义RecyclerView.ItemAnimator其实很简单
  6. recyclerview-animators
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初心一点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值