Android 基础之RecyclerView复习

1、引入v7包和recyclerview包。

2、使用recyclerview ,

      布局或者代码创建实例

      设置布局管理器,可以加入对Item的修饰

      设置adapter。
布局中加入

 <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@drawable/divider"
        android:padding="20dp"/>

1、引用以及设置LayoutMananger、adapter、decoration

 recycler_view = findViewById(R.id.recycler_view);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recycler_view.setLayoutManager(linearLayoutManager);
        recycler_view.addItemDecoration(new ItemDivederDecoration(this,ItemDivederDecoration.ORIENTATION_HORIZONTAL));
        recycler_view.setAdapter(new RecyclerViewAdapter());

2、adapter的代码如下

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ItemViewHolder> {


    @Override
    public int getItemCount() {
        return 20;
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        return new ItemViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item,viewGroup,false));
    }


    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder viewHolder, int i) {

        viewHolder.title.setText("HAHAH "+ i);

    }


    class ItemViewHolder extends RecyclerView.ViewHolder{

        private TextView title;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);
            title = (TextView) itemView;
        }

    }

}

   adapter继承自RecyclerView.Adapter<T extends ViewHloder>,实现关键的三个抽象方法,

         getItemCount()决定这个列表内有几个item的即列表内元素数量的方法,

         onCreateViewHolder()是创建ViewHolder的方法

        onBindViewHolder(),对viewholder内的view进行状态设置的方法。

另外还有实现的ViewHolder作为onCreateViewHolder中返回的ViewHolder。
3、LayoutManager

   support中实现了三种Layoutmanager:线性,grid,瀑布流。

4、decoration,对列表内的元素进行装饰的类,继承自ItemDecoration,下面是对线性的一个实现,

public class ItemDivederDecoration extends RecyclerView.ItemDecoration {

    private static final String TAG = "ItemDivederDecoration";

    public static final int ORIENTATION_HORIZONTAL = LinearLayoutManager.HORIZONTAL;
    public static final int ORIENTATION_VERTICAL = LinearLayoutManager.VERTICAL;

    @IntDef({ORIENTATION_HORIZONTAL, ORIENTATION_VERTICAL})
    @Retention(RetentionPolicy.SOURCE)
    public @interface OrientationCheck {

    }

    int[] attrs = new int[]{
            android.R.attr.listDivider
    };

    private int orientation;
    private Drawable mDividerDrawable;

    public ItemDivederDecoration(Context context, @OrientationCheck int orientation) {
        TypedArray ta = context.obtainStyledAttributes(attrs);
        mDividerDrawable = context.getResources().getDrawable(R.drawable.divider);
                //ta.getDrawable(0);
        ta.recycle();
        setOrientation(orientation);
    }


    public void setOrientation(int orientation) {
        this.orientation = orientation;
    }

    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        if (orientation==ORIENTATION_HORIZONTAL){
            outRect.set(0,0,mDividerDrawable.getIntrinsicWidth(),0);
        }else {
            outRect.set(0,0,0,mDividerDrawable.getIntrinsicHeight());
        }
    }


    @Override
    public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.onDraw(c, parent, state);
        if (orientation == ORIENTATION_HORIZONTAL) {
            drawHorizontal(c, parent);
        } else {
            drawVertical(c, parent);
        }
    }

    private void drawVertical(Canvas c, RecyclerView parent) {
        int paddingLeft = parent.getPaddingLeft();
        int paddingRight = parent.getWidth()-parent.getPaddingRight();
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View childView = parent.getChildAt(i);
            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) childView.getLayoutParams();
            int top = childView.getBottom()+ layoutParams.bottomMargin;
            int bottom = top+mDividerDrawable.getIntrinsicHeight();
            mDividerDrawable.setBounds(paddingLeft,top,paddingRight,bottom);
            mDividerDrawable.draw(c);
        }

    }

    private void drawHorizontal(Canvas c, RecyclerView parent) {
        int top = parent.getPaddingTop();
        int bottom = parent.getHeight() - parent.getPaddingBottom();
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View childView = parent.getChildAt(i);
            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) childView.getLayoutParams();
            int left = childView.getRight()+layoutParams.rightMargin;//getRight不能使用getWidth代替
            int right = left+mDividerDrawable.getIntrinsicWidth();
            mDividerDrawable.setBounds(left,top,right,bottom);
            mDividerDrawable.draw(c);
        }
    }


}

上方主要实现了两个方法,onDraw和getItemOffsets两个方法。onDraw()在指位置画一个分割线,getItemOffsets设置对Item的偏移。

 

有了这些就实现了一个展示,对于点击事件可能也需要我们可以在Adapter或者ViewHolder中实现。

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值