精华内容
下载资源
问答
  • Android RecycleView1 基础使用、Android RecycleView2 实现 不同类型ViewType显示、 HeadrView、FooterView 添加、Android RecyclerView3 中 item 侧滑、拖住实现 博客地址1:...
  • 本文实例为大家分享了CheckBox全选、反选、单选的具体代码,供大家参考,具体内容如下 MainActiivity ... import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7....
  • Recyclerview是listview的升级版本,相对来说更复杂,但是功能更强,主要难点在自定义适配器里,完成版直接导入Android Studio。
  • Android RecycleView使用详解

    万次阅读 2017-01-23 11:29:49
    一、RecycleView简要介绍  RecycleView是support-v7包中的新组件,是一个强大的滑动组件。相比于ListView和GridView具有很多让开发者喜欢的优点,如:数据绑定,Item的创建和View的回收复用机制等。但RecycleView...


    一、RecycleView简要介绍

        RecycleView是support-v7包中的新组件,是一个强大的滑动组件。相比于ListView和GridView具有很多让开发者喜欢的优点,如:数据绑定,Item的创建和View的回收复用机制等。但RecycleView更加高级灵活,当我们数据因为用户事件或者网络事件发生改变的时候也能很好的进行显示。RecycleView最主要的特点就是复用。
    二、RecycleView与ListView区别

        RecycleView是ListView的升级版,与经典的ListView相比,同样具有item的回收复用功能。

    1.RecycleView封装了ViewHolder的回收复用,标准化了ViewHolder,编写Adapter面向的是ViewHolder,而不是View,高度解耦,复用的逻辑被封装,给编写代码带来更大的方便。

    2.RecycleView提供了一种插拔式的体验,高度解耦,异常灵活,为了来控制item的显示,RecycleView针对一个Item的显示专门抽取了相应的类,使其扩展性非常强。

    3.可以控制Item增减动画,可以通过ItemAnimation来进行控制。当然,RecycleView有其自己默认的实现方式。

    4.使用LayoutManager来确定每一个item的排列方式。

    5.在使用RecycleView之前,需要继承RecycleView.Adapter适配,将数据与每个item进行绑定。

    6.利用LayoutManager确定每一个item如何摆放、何时展示与隐藏。或者回收复用View的时候,LayoutManager回想适配器请求新的数据来替换以前的数据,该机制避免了创建过多的View和频繁调用Id方法。

    三、Recycle基本用法

    1.在项目gradle下添加依赖。

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

    2.实现RecycleView布局。

    <android.support.v7.widget.RecyclerView
        android:id="@+id/id_recyclerview"
        android:divider="#ffff0000"
        android:dividerHeight="10dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    

    3.设置布局管理器。布局主要有三种实现方式,本文采用流式布局进行解析。

    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));    //线性布局
    mRecyclerView.setLayoutManager(new GridLayoutManager(this, 4));     //网格
    mRecyclerView.setLayoutManager(new
            StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL));     //流式布局
    

    4.设置Adapter与ViewHolder进行事件绑定。

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        ViewGroup.LayoutParams lp = holder.tv.getLayoutParams();
        if(position != 0 && position < mDatas.size()){
            lp.height = mHeights.get(position);
            holder.tv.setLayoutParams(lp);
        }
        holder.tv.setText(mDatas.get(position));
    
    }
    
    

    5.setAdapter与设置分割线、Item动画。

    mAdapter = new HomeAdapter(this, mDatas);
            mAdapter.setOnItemClickListener(this);
            mRecyclerView.setAdapter(mAdapter);
            //设置默认分割线
    //        mRecyclerView.addItemDecoration(new DividerItemDecoration(this,
    //                DividerItemDecoration.VERTICAL));
            mRecyclerView.addItemDecoration(new DividerGridItemDecoration(this));
    
            //设置Item动画
            mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    

    6.初始化数据。

    private void initListData() {
        mDatas = new ArrayList<String>();
        for (int i = 'A'; i <= 'z'; i++) {
            mDatas.add("" + (char) i);
        }
    }
    

    7.设置Item点击事件(增加Item)。RecycleView没有像ListView一样给我提供一个onItemClickListener内置监听器,当我们点击item触发事件的时候会回调相关方法,不过我们可以改造Adapter以达到我们的目的。

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int pos = holder.getLayoutPosition();
            listener.OnItemClick(holder.itemView, pos);
            addData(pos);
        }
    });
    

    public void addData(int position)
    {
        mDatas.add(position, "Insert One");
        notifyItemInserted(position);
    }
    

    8.设置长按点击事件(移除Item)。同7一样,主要是使用RecycleView方法添加和删除数据。与ListView不同的是,ListView在数据发生变化的时候采用的是notifyDatasetChange方法刷新数据,但RecycleView采用更高级的方法notifyItemInserted(position)和notifyItemRemoved(position)来进行添加和删除的数据刷新。

    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            int pos = holder.getLayoutPosition();
            listener.onItemLongClick(holder.itemView, pos);
            removeData(pos);
            return false;
        }
    });
    

    public void removeData(int position)
    {
        mDatas.remove(position);
        notifyItemRemoved(position);
    }
    

    9.分割线的封装。

    package example.com.demo_recycleview;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Canvas;
    import android.graphics.Rect;
    import android.graphics.drawable.Drawable;
    import android.support.v7.widget.GridLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.support.v7.widget.StaggeredGridLayoutManager;
    import android.view.View;
    
    
    public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {
    
        private static final int[] ATTRS = new int[] { android.R.attr.listDivider };
        private Drawable mDivider;
    
        public DividerGridItemDecoration(Context context)
        {
            final TypedArray array = context.obtainStyledAttributes(ATTRS);
            mDivider = array.getDrawable(0);
            array.recycle();
        }
    
        @Override
        public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)
        {
    
            drawHorizontal(c, parent);
            drawVertical(c, parent);
    
        }
    
        private int getSpanCount(RecyclerView parent)
        {
            // 列数
            int spanCount = -1;
            RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
            if (layoutManager instanceof GridLayoutManager)
            {
    
                spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
            } else if (layoutManager instanceof StaggeredGridLayoutManager)
            {
                spanCount = ((StaggeredGridLayoutManager) layoutManager)
                        .getSpanCount();
            }
            return spanCount;
        }
    
        public void drawHorizontal(Canvas c, RecyclerView parent)
        {
            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.getLeft() - params.leftMargin;
                final int right = child.getRight() + params.rightMargin
                        + mDivider.getIntrinsicWidth();
                final int top = child.getBottom() + params.bottomMargin;
                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);
    
                final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                        .getLayoutParams();
                final int top = child.getTop() - params.topMargin;
                final int bottom = child.getBottom() + params.bottomMargin;
                final int left = child.getRight() + params.rightMargin;
                final int right = left + mDivider.getIntrinsicWidth();
    
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(c);
            }
        }
    
        private boolean isLastColum(RecyclerView parent, int pos, int spanCount,
                                    int childCount)
        {
            RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
            if (layoutManager instanceof GridLayoutManager)
            {
                if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边
                {
                    return true;
                }
            } else if (layoutManager instanceof StaggeredGridLayoutManager)
            {
                int orientation = ((StaggeredGridLayoutManager) layoutManager)
                        .getOrientation();
                if (orientation == StaggeredGridLayoutManager.VERTICAL)
                {
                    if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边
                    {
                        return true;
                    }
                } else
                {
                    childCount = childCount - childCount % spanCount;
                    if (pos >= childCount)// 如果是最后一列,则不需要绘制右边
                        return true;
                }
            }
            return false;
        }
    
        private boolean isLastRaw(RecyclerView parent, int pos, int spanCount,
                                  int childCount)
        {
            RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
            if (layoutManager instanceof GridLayoutManager)
            {
                childCount = childCount - childCount % spanCount;
                if (pos >= childCount)// 如果是最后一行,则不需要绘制底部
                    return true;
            } else if (layoutManager instanceof StaggeredGridLayoutManager)
            {
                int orientation = ((StaggeredGridLayoutManager) layoutManager)
                        .getOrientation();
                // StaggeredGridLayoutManager 且纵向滚动
                if (orientation == StaggeredGridLayoutManager.VERTICAL)
                {
                    childCount = childCount - childCount % spanCount;
                    // 如果是最后一行,则不需要绘制底部
                    if (pos >= childCount)
                        return true;
                } else
                // StaggeredGridLayoutManager 且横向滚动
                {
                    // 如果是最后一行,则不需要绘制底部
                    if ((pos + 1) % spanCount == 0)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
    
        @Override
        public void getItemOffsets(Rect outRect, int itemPosition,
                                   RecyclerView parent)
        {
            int spanCount = getSpanCount(parent);
            int childCount = parent.getAdapter().getItemCount();
            if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部
            {
                outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
            } else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边
            {
                outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
            } else
            {
                outRect.set(0, 0, mDivider.getIntrinsicWidth(),
                        mDivider.getIntrinsicHeight());
            }
        }
    }
    


    四、效果展示

                 

    五、源码下载      

    地址:http://download.csdn.net/detail/u012721519/9743570





    Good luck!

    Write by Jimmy.li











    展开全文
  • RecycleView使用

    2019-04-25 00:35:23
    Android RecycleView使用总结获取RecyclerView的某个Item的坐标 获取RecyclerView的某个Item的坐标 final ViewTreeObserver viewTreeObserver = getActivity().getWindow().getDecorView().getViewTreeObserver...

    1. RecycleView滚动条展示隐藏
    Recycleview或ScrollView 滚动条控件的滑块颜色,其实通过布局属性android:scrollbarThumbVertical 可以关联一个drawable对象

    
    // 设置滚动条样式
    android:scrollbarThumbVertical="@drawable/scrollbar_handle_holo_light"
    
    // 设置滚动条是否可见
    android:scrollbars="none"
    
    

    2. 获取RecyclerView的某个Item的坐标

    
    final ViewTreeObserver viewTreeObserver = getActivity().getWindow().getDecorView().getViewTreeObserver();
    
    // 写这句代码是因为很多同学都喜欢在RecycleView以及内部View未加载完毕后调用获取宽高之类的方法
    // 原因是View都还没加载成功,一定是获取不到预期宽高之类的数据的
    // 当然你确保RecycleView已经加载完毕,可以直接使用onGlobalLayout里面代码
    viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
    		
    		RecyclerView.ViewHolder holder 
    		= mRecyclerView.findViewHolderForAdapterPosition(0);
    		// 假设第一个Item是CategoryViewHolder类型
        	if (holder != null && holder instanceof CategoryViewHolder) {
           	 	CategoryViewHolder viewHolder = (CategoryViewHolder) holder;
           	 	int[] location = new int[2];
            	viewHolder.image.getLocationOnScreen(location);
            	// 获取到Item中image控件在屏幕上的坐标位置
            }
        
    		......
    		// 切记记得remove
    		viewTreeObserver.removeOnGlobalLayoutListener(this);
            }
        });
       
    

    3. RecycleView在某些场景自动滚动问题

    RecycleView 由于会自动获取焦点,其父ViewGroup可以通过如下设置来解决

    // 通过设置RecycleView父View focusable 和focusableInTouchMode 为true
    <......Layout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:focusable="true"
            android:focusableInTouchMode="true">
    
            <......RecyclerView
                android:id="@+id/recycle_vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fadingEdge="none"
                android:focusable="false"
                android:focusableInTouchMode="false"
                android:scrollbarStyle="insideOverlay"
                android:scrollbars="none" />
    
    </......Layout>
    

    4. RecycleView刷新单个Item
    参考:

    5. 获取RecyclerView的某个Item的坐标另一种实现

    if(mAdapter.getItemCount() > 0) {
        RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForAdapterPosition(0);
        if (holder != null && holder instanceof CategoryViewHolder) {
            CategoryViewHolder viewHolder = (CategoryViewHolder) holder;
            int[] location = new int[2];
            // 获取RecycleView中某个Item在屏幕上坐标(走上角)
            viewHolder.image.getLocationOnScreen(location);
        }
    }
    

    6. RecyclerView快速滑动到顶部

    // RecyclerView提供了以下几个api控制RecyclerView滑动
    
    // 按一定速度滚动到指定的位置
    SmoothScrollToPosition(int position) 
    // 按一定速度滚动指定的距离
    smoothScrollBy(int dx, int dy)   
    //  跳转到指定的位置
    scrollToPosition(int position)  
    // 跳转指定的距离
    scrollBy(int dx,int dy)    
    

    7. 参考

    1. NestedScrollView嵌套RecyclerView
    2. RecyclerView抢焦点自动滚动
    3. RecycleView一些扩展用法
    4. RecyclerView快速滑动到顶部(源码分析) 改变滑动速度等
    5. RecyclerView滑动到指定位置
    展开全文
  • recycleview和glide使用

    2017-04-07 17:48:31
    recycleview 刷新加载和 glide加载图片
  • RecycleView使用总结一

    千次阅读 2018-05-13 11:54:46
    1. RecycleView和ListView的区别功能方面:2.抽象ViewHolder,增加RecycleView的可扩展性3.自定义ItemDecoration

    一.  RecycleView和ListView的区别

    前两天面试,面试官问我,“ListView和RecycleView都用过吧,你是怎么选的?”。当时有点懵比,扯了一通,最后又引出了几个问题“RecycleView相比ListView哪方面性能更好,如何获取第一个可见的Item,如何给RecycleView添加headerView?”。谈到添加headerView,我说把第一个Item作为headerView的思路,又问“每个Item都对应一个数据info,headerView的没有用,会不会浪费,该怎么处理?。。”;问题虽然不能,但是因为没有比较过两者,加上对二者的某些API也不熟,整个回答过程磕磕绊绊,令人失望。在此,做一下总结,内容不全,以后了解到更多,再继续添加。



    二. 抽象ViewHolder,增加RecycleView的可扩展性,阅读性

    1.抽象出ViewHolder,定义一个数据类型接口,来区分出不同类型

    public class BaseViewHolder extends RecyclerView.ViewHolder {
    
        public BaseViewHolder(View itemView) {
            super(itemView);
        }
    
    
        public void FillView(IData data){
    
        }
    }

    数据类型接口IData.java,传递给adapter的数据要实现该接口,每个ViewHolder的Item实体数据类都实现该接口,同时返回不同类型值,以便在创建具体ViewHolder时,根据类型加载不同的ViewHolder。

    public interface IData {
        int typ();
    }

    传递数据的实体类,跟具体的ViewHolder相对应:

    Info1:

    public class Info1 implements IData {
        @Override
        public int typ() {
            return RecycleItemTypeConstant.RECYCLEVIEW_ITEM_TYPE_1;
        }
    
        private int left_icon_id;
        private String center_str;
        private String right_str;
    
        public int getLeft_icon_id() {
            return left_icon_id;
        }
    
        public void setLeft_icon_id(int left_icon_id) {
            this.left_icon_id = left_icon_id;
        }
    
        public String getCenter_str() {
            return center_str;
        }
    
        public void setCenter_str(String center_str) {
            this.center_str = center_str;
        }
    
        public String getRight_str() {
            return right_str;
        }
    
        public void setRight_str(String right_str) {
            this.right_str = right_str;
        }
    }
    

    Info2:

    public class Info2 implements IData {
        @Override
        public int typ() {
            return RecycleItemTypeConstant.RECYCLEVIEW_ITEM_TYPE_2;
        }
    
        private String title;
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    }

    2.继承BaseViewHolder,实现不同布局:

    如:ViewHolder1

    public class ViewHolder1 extends BaseViewHolder {
    
        private ImageView leftIcon;
        private TextView centerTitle;
        private TextView rightTitle;
        public ViewHolder1(View itemView) {
            super(itemView);
            leftIcon=itemView.findViewById(R.id.recycle_item_left_icon);
            centerTitle=itemView.findViewById(R.id.recycle_item_center_title);
            rightTitle=itemView.findViewById(R.id.recycle_item_right_title);
        }
    
        @Override
        public void FillView(IData data) {
            super.FillView(data);
            if (data instanceof Info1){
                leftIcon.setImageResource(((Info1) data).getLeft_icon_id());
                centerTitle.setText(((Info1) data).getCenter_str());
                rightTitle.setText(((Info1) data).getRight_str());
            }
        }
    }

    ViewHolder2:

    public class ViewHolder2 extends BaseViewHolder {
        private TextView title;
        public ViewHolder2(View itemView) {
            super(itemView);
    
            title=itemView.findViewById(R.id.recycle_item_center_title);
    
        }
    
        @Override
        public void FillView(IData data) {
            super.FillView(data);
            title.setText(((Info2)data).getTitle());
        }
    }

    等等,根据需要,添加多个。添加新的样式,只要添加一个新的ViewHolder对象,并稍微修改一下adapter即可

    3.实现adapter:

    public class RecycleAdapter extends RecyclerView.Adapter<BaseViewHolder> {
    
        private List<IData>listDatas;
        private Context mContext;
    
        public RecycleAdapter(List<IData> listDatas, Context mContext) {
            this.listDatas = listDatas;
            this.mContext = mContext;
        }
    
        @Override
        public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    
            BaseViewHolder viewHolder=null;
            switch (viewType){
    
                case RecycleItemTypeConstant.RECYCLEVIEW_ITEM_TYPE_1:
                    viewHolder=onCreateViewHolder1(parent);
                    break;
                case RecycleItemTypeConstant.RECYCLEVIEW_ITEM_TYPE_2:
                    viewHolder=onCreateViewHolder2(parent);
                    break;
                case RecycleItemTypeConstant.RECYCLEVIEW_ITEM_TYPE_3:
                    viewHolder=onCreateViewHolder3(parent);
                    break;
                default:
                    viewHolder=onCreateDefaultViewHolder(parent);
    
                        break;
    
            }
    
            return viewHolder;
        }
    
        private BaseViewHolder onCreateDefaultViewHolder(ViewGroup parent){
            TextView textView = new TextView(mContext);
            BaseViewHolder holder = new BaseViewHolder(textView);
            return holder;
        }
    
        private BaseViewHolder onCreateViewHolder1(ViewGroup parent){
            View itemView= LayoutInflater.from(mContext).inflate(R.layout.layout_type_1,parent,false);
            ViewHolder1 viewHolder=new ViewHolder1(itemView);
            return viewHolder;
        }
    
        private BaseViewHolder onCreateViewHolder2(ViewGroup parent){
            View itemView= LayoutInflater.from(mContext).inflate(R.layout.layout_type_2,parent,false);
            ViewHolder2 viewHolder=new ViewHolder2(itemView);
            return viewHolder;
        }
    
        private BaseViewHolder onCreateViewHolder3(ViewGroup parent){
            View itemView= LayoutInflater.from(mContext).inflate(R.layout.layout_type_3,parent,false);
            ViewHolder3 viewHolder=new ViewHolder3(itemView);
            return viewHolder;
        }
    
    
    
        @Override
        public void onBindViewHolder(BaseViewHolder holder, int position) {
            try {
                holder.FillView(listDatas.get(position));
            }catch (Exception e){
                Log.i("RecycleView","onLayout Error: " + e.toString() + "for holder: "
                        + holder.getClass().getSimpleName());
            }
        }
    
        @Override
        public int getItemCount() {
            return listDatas.size();
        }
    
    
        @Override
        public int getItemViewType(int position) {
            if (position<0||position>listDatas.size()-1){
                return -1;
            }
            return listDatas.get(position).typ();
        }
    }

    4.使用,在传给adapter的数据集合中,添加每种类型的数据,即会创建相应布局的Item:

    如:

           datas=new ArrayList<>();
            Info1 info1=new Info1();
            info1.setCenter_str("种类1");
            info1.setRight_str("右边");
            info1.setLeft_icon_id(R.mipmap.ic_launcher);
    
            Info2 info2=new Info2();
            info2.setTitle("卡片2");
    
            Info3 info3=new Info3();
            info3.setCenter_str("3");
            info3.setRight_str("右边");
            info3.setLeft_icon_id(R.mipmap.ic_launcher);
    
            datas.add(info1);
            datas.add(info2);
            datas.add(info3);

    三. 自定义ItemDecoration

    通过自定义ItemDecoration可实现,RecycleView各种各样的分割线。自定义ItemDecoration,通过复写他的三个方法就可快速实现。其中,要注意的是:getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)的outRect相当于margin,通过设置他,可控制Item view距离上下,左右的距离;onDraw()方法是在Item:

    API关于onDraw()的说明: 他是在item被绘制前绘制的,因此如果onDraw的绘制位置和Item的位置位置重叠,就会被覆盖,这也是,为什么我们要在getItemOffsets中设置outRect,来实现边距的原因(个人理解,不知对否)。我们在onDraw中实现绘制时就在留出的空间中进行绘制。至于绘制,完全就是利用Canvas进行绘制,可根据需求,各种绘画。

    /**
             * Draw any appropriate decorations into the Canvas supplied to the RecyclerView.
             * Any content drawn by this method will be drawn before the item views are drawn,
             * and will thus appear underneath the views.
             *
             * @param c Canvas to draw into
             * @param parent RecyclerView this ItemDecoration is drawing into
             * @param state The current state of RecyclerView
             */
            public void onDraw(Canvas c, RecyclerView parent, State state) {
                onDraw(c, parent);
            }

    onDrawOver()是在item绘制之后调用,绘制在它上面。绘制起来和onDraw一样,也是使用canvas想怎么绘怎么绘。

        /**
             * Draw any appropriate decorations into the Canvas supplied to the RecyclerView.
             * Any content drawn by this method will be drawn after the item views are drawn
             * and will thus appear over the views.
             *
             * @param c Canvas to draw into
             * @param parent RecyclerView this ItemDecoration is drawing into
             * @param state The current state of RecyclerView.
             */
            public void onDrawOver(Canvas c, RecyclerView parent, State state) {
                onDrawOver(c, parent);
            }
    最后,是一个小demo,自定义ItemDecoration如下
    public class CustomItemDecoration extends RecyclerView.ItemDecoration {
    
    
        Paint mPaint;
        public CustomItemDecoration() {
            super();
            mPaint=new Paint();
            mPaint.setColor(Color.RED);
            mPaint.setStyle(Paint.Style.FILL);
    
        }
    
        /**
         *在itemView绘制之前绘制,所以要通过getItemOffsets设置好距离,留出空间,防止被后绘得的itemView覆盖掉
         * @param c
         * @param parent
         * @param state
         */
        @Override
        public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
            super.onDraw(c, parent, state);
    //        int childCount = parent.getChildCount();
    //        for ( int i = 0; i < childCount; i++ ) {
    //            View view = parent.getChildAt(i);
    //            int index = parent.getChildAdapterPosition(view);
    //            float top = view.getBottom();
    //            float extra=view.getHeight()/2;
    //            c.drawCircle(50, top+extra,20,mPaint);
    //        }
        }
    
        /**
         * 在itemVie上面绘制,根据设计,使用canvas进行绘制即可
         * @param c
         * @param parent
         * @param state
         */
        @Override
        public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
            super.onDrawOver(c, parent, state);
    
            int childCount = parent.getChildCount();
            for ( int i = 0; i < childCount; i++ ) {
                View view = parent.getChildAt(i);
                int index = parent.getChildAdapterPosition(view);
                float top = view.getTop();
                float extra=view.getHeight()/2;
                c.drawCircle(50, top+extra,20,mPaint);
            }
    
        }
    
        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            super.getItemOffsets(outRect, view, parent, state);
    
            if (parent.getChildAdapterPosition(view)!=0) {
                outRect.top = 10;
                outRect.left=100;
            }
        }
    }

    效果如下:


    主要参考文章:

    小甜点,RecyclerView 之 ItemDecoration 讲解及高级特性实践,作者讲的非常详尽易懂。


    展开全文
  • RecycleView虽然很强大,比如说高效,比如说高度解耦,比如说泛型的限制,比如说增加或者删除item的时候的高效刷新以及动画效果,但是强大了就没那么傻瓜化了,使用需要注意的地方这了稍微总结一下。 1,首先...

    RecycleView虽然很强大,比如说高效,比如说高度解耦,比如说泛型的限制,比如说增加或者删除item的时候的高效刷新以及动画效果,但是强大了就没那么傻瓜化了,使用需要注意的地方这了稍微总结一下。

    1,首先RecycleView是没有定义出onItemClick以及LongOnItemClick事件,需要使用者自己去定义回调listener接口。

    在回调过程中也要注意一些细节,类似于快速滑动listview的时候展示的倒计时会错乱展示的一类问题,可能会出现:明明点击的是第1个item,但是回调监听提示的却说点击了第2个或者其他的item。

    对于这类问题的解决方案:其实问题的原因是操作的item的position不统一导致的,解决办法就是,处理这个不统一,可以通过构造方法的方式来解决

    import java.util.List;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> {
    
        private List<String> list;
        private OnItemClickListener mOnItemClickListener;
    
        public MyRecyclerAdapter(List<String> list) {
            // TODO Auto-generated constructor stub
            this.list = list;
        }
    
        class MyViewHolder extends RecyclerView.ViewHolder{
            TextView tv;
    
            public MyViewHolder(View view) {
                super(view);
                tv = (TextView)view.findViewById(android.R.id.text1);
    
            }
    
        }
    
        @Override
        public int getItemCount() {
            // TODO Auto-generated method stub
            return list.size();
        }
    
        @Override
        public void onBindViewHolder(MyViewHolder holder, final int position) {
            //绑定数据
            holder.tv.setText(list.get(position));
            //进行非空判断来增强代码健壮性
            if(mOnItemClickListener!=null){
                holder.itemView.setOnClickListener(new OnClickListener() {
    /**
      *所说的注意点就是这里,onBindViewHolder方法的position和onClick方法里面
      *的回调方法中的position不一致导致的问题。
      *解决办法:可以将这个onClick点击事件封装在一个内部类中,设置点击的时候就直接
      *将onBindViewHolder方法中的position通过构造传递进去,从而避免了,直到点击
      *了,执行了onClick方法才将position传递进去,也就避免了这个position的错乱。
      */
                    @Override
                    public void onClick(View v) {
                        mOnItemClickListener.onItemClick(v, position);
                    }
                });
            }
        }
    
        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {
            // 创建ViewHolder
            MyViewHolder holder = new MyViewHolder(View.inflate(viewGroup.getContext(), android.R.layout.simple_list_item_1, null));
            return holder;
        }
    
        public void addData(int position){
            list.add(position,"additem"+position);
            //提示刷新--会影响效率
    //      notifyDataSetChanged();
            notifyItemInserted(position);
        }
        public void removeData(int position){
            list.remove(position);
            notifyItemRemoved(position);
        }
    
        public interface OnItemClickListener{
            void onItemClick(View view, int position);
        }
    
        public void setOnItemClickListener(OnItemClickListener listener){
            this.mOnItemClickListener = listener;
        }
    
    
    }
    

    2,

    展开全文
  • RecycleView使用详解

    千次阅读 2018-12-24 15:14:55
    RecycleView 使用详解 简介 RecycleView是一个类似 ListView GridView的控件。但是相比于这两者Recycleview更加的灵活、强大;使用Recycleview你可以更轻松的在开发中实现一些特殊的布局,并使你的应用更加的酷炫 ...
  • 文章目录使用RecycleView的好处RecycleView的基本用法使用RecycleView的网格布局RecycleView的定位和查找RecycleView的Item增加删除RecycleView实现不同item布局RecycleView实现瀑布流 使用RecycleView的好处 从...
  • 注意一定要加选中的部分,否则position会错位
  • Android RecycleView使用方法的介绍

    千次阅读 2018-03-18 21:29:21
    一、RecycleView的基本使用 RecycleView同ListView一样在APP页面中以列表的形式显示元素,由于提供数据的方式有很多种list,array,map或者set等,但是最终都需要将这些数据源,以统一的样式显示出来。因此在...
  • databing使用指南 简介简单使用 简介 随着Android的发展,最初的MVC框架远远无法满足广大_Android猿_ 的需求,进而出现了MVP、MVVM等开发框架,Databing就是Google官方出品的支持MVVM开发的一个依赖库。或许说依赖库...
  • 1、添加recycleview依赖 compile('com.android.support:recyclerview-v7:25.1.1') { force = true } 2、item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=...
  • NestScrollView嵌套recycleview使用出现的问题 自己在使用过程中出现的问题,在网上找到的解决办法记录一下 1.NestScrollView和recycleview一起使用出现滑动冲突 解决办法:取消recycleview的滑动 recyclerView....
  • 写这篇文章的由衷是在项目里面遇到了这样的一个问题,使用recycleView,列表样式使用GridLayoutManager设置,再此基础上添加头部,如果只是一味的往下写,当做LinearLayoutManager来做,那么列表显示就有问题了,我...
  • 最近在写一个新项目,用到了tablayout+viewpager+fragment,Activity布局用的是比较流行的ConstraintLayout,fragment中放的是各种recyccleview,但是使用后发现,recyccleview中的条目加载不完全,总是少一两条,...
  • RecycleView的简单使用 RecycleView的简单使用总共分为以下几个步骤: 在Layout中寻找合适位置添加RecycleView(如果输入RecycleView没有弹出相关控件,可以去添加一下依赖文件); 创建一个recycleView_item.xml文件...
  • DataBinding在recycleview中的使用,DataBinding在recycleview中的使用
  • 最近在使用RecycleView的时候遇到的一些问题: 1.Recycleview 填充的子条目虽然设置的是match_parent, 但是实际看到的子条目并没有填充父窗体; 子item填充用的是: View view = View.inflate(getActivity(),R.layout...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,803
精华内容 9,121
关键字:

recycleview使用