美文网首页
RecyclerView的简单使用

RecyclerView的简单使用

作者: ironman_ | 来源:发表于2017-07-01 01:02 被阅读0次

    添加依赖:

    compile 'com.android.support:recyclerview-v7:21.0.3'
    

    在layout文件中添加recyclerview:

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

    在代码中设置adapter以及设置divider:

    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    recyclerView.addItemDecoration(new VirticalDivider());
    adapter = new DrawerListAdapter(getContext());
    recyclerView.setAdapter(adapter);
    

    这里的VirticalDivider会找不到,不过不要着急,这个是用来给RecyclerView设置divider的,下面会讲到。

    实现Adapter

    recyclerview的adapter会有一个官方的ViewHolder

    public class DrawerListAdapter extends RecyclerView.Adapter<DrawerListAdapter.ViewHolder> {
    
        private ArrayList<ApkName> data = new ArrayList<>();
        private Context context;
    
        public DrawerListAdapter(Context context) {
            this.context = context;
        }
    
        public void updateData(List<ApkName> names) {
            data.clear();
            if (ArrayUtils.isNotEmpty(names)) {
                data.addAll(names);
            }
            notifyDataSetChanged();
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.layout_item_drawer_menu, parent, false));
        }
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            ApkName name = data.get(position);
            holder.tvTitle.setText(name.name);
    
        }
    
        @Override
        public int getItemCount() {
            return data.size();
        }
    
        public static class ViewHolder extends RecyclerView.ViewHolder{
    
            @BindView(R.id.drawer_item_title)
            TextView tvTitle;
            @BindView(R.id.drawer_item_icon)
            ImageView ivIcon;
            @BindView(R.id.drawer_item_container)
            ViewGroup container;
    
            public ViewHolder(View itemView) {
                super(itemView);
                ButterKnife.bind(this, itemView);
            }
        }
    }
    

    adapter需要继承RecyclerView.Adapter并且有一个RecyclerView.ViewHolder的子类作为泛型。
    这里的ViewHolder需要继承RecyclerView.ViewHolder,并且需要实现一个构造方法。
    onCreateViewHolder里需要实例化每一行的view。
    onBindViewHolder就是实现view与数据的绑定了。

    给recyclerview添加divider

    只需要实现onDraw方法就好了,会在这个方法里根据for循环来一次把所有的divider都画出来了。

    public class VirticalDivider extends RecyclerView.ItemDecoration {
    
        public static final int DEVIDER_HEIGHT = 1;
    
        @Override
        public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
            super.onDraw(canvas, parent, state);
            int dividerLeft = parent.getPaddingLeft();
            int dividerRight = parent.getWidth() - parent.getPaddingRight();
    
            int childCount = parent.getChildCount();
            Paint paint = new Paint();
            paint.setColor(Color.GRAY);
            //for循环在每一个item后面画一条线,最后一个不画,i < childCount -1
            for (int i = 0; i < childCount -1; i++) {
                View child = parent.getChildAt(i);
    
                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
    
                int dividerTop = child.getBottom() + params.bottomMargin;
                int dividerBottom = dividerTop + DEVIDER_HEIGHT;
                //设置矩形的大小
                Rect rect = new Rect(dividerLeft, dividerTop, dividerRight, dividerBottom);
                //画一个矩形
                canvas.drawRect(rect, paint);
            }
        }
    }
    

    其实还有一些其他的写法:
    from:https://gist.github.com/alexfu/0f464fc3742f134ccd1e#file-divideritemdecoration-java

    public class DividerItemDecoration extends RecyclerView.ItemDecoration {
    
        private static final int[] ATTRS = new int[]{
                android.R.attr.listDivider
        };
    
        public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
    
        public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
    
        private Drawable mDivider;
    
        private int mOrientation;
    
        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_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);
            }
        }
    
        public void drawVertical(Canvas c, RecyclerView parent) {
            final int left = parent.getPaddingLeft();
            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);
                final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                        .getLayoutParams();
                final int top = child.getBottom() + params.bottomMargin;
                final int bottom = top + mDivider.getIntrinsicHeight();
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(c);
            }
        }
    
        public 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; 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);
            }
        }
    
        @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);
            }
        }
    }
    

    这里基本就能满足一些常见用法。

    todo:

    • 各个LayoutManager的用法以及实现。
    • recyclerview丰富的动画的使用。

    相关文章

      网友评论

          本文标题:RecyclerView的简单使用

          本文链接:https://www.haomeiwen.com/subject/wckwcxtx.html