Android Studio第二十九期 - RecycleView的表格形式

恢弘志士之气,不宜妄自菲薄。这篇文章主要讲述Android Studio第二十九期 - RecycleView的表格形式相关的知识,希望能为你提供帮助。
        本来说好了,最后一篇了,结果又来了一个新需求,就再写一篇吧~

        效果图是这样的:

       

Android Studio第二十九期 - RecycleView的表格形式

文章图片

        思路是这样:

       
Android Studio第二十九期 - RecycleView的表格形式

文章图片

        demo效果:

       
Android Studio第二十九期 - RecycleView的表格形式

文章图片

        其实要注意的地方是:

【Android Studio第二十九期 - RecycleView的表格形式】        1.RecycleView在ScrollView中不滚动的设置;

        2.RecycleView在ScrollView中滚动不灵敏;
        3.RecycleView表格显示列数的填充算法;

        不滚动的写法:

        FullyLinearLayoutManager:
package  com.example.p010_recycleviewall.recycleviewbiaoge; import  android.content.Context; import  android.support.v7.widget.LinearLayoutManager; import  android.support.v7.widget.RecyclerView; import  android.util.Log; import  android.view.View; import  android.view.ViewGroup; /**   *  Created  by  shining  on  2017/1/10  0010.   */public  class  FullyLinearLayoutManager  extends  LinearLayoutManager  {        private  static  final  String  TAG  =  FullyLinearLayoutManager.class.getSimpleName();         public  FullyLinearLayoutManager(Context  context)  {                 super(context);         }        public  FullyLinearLayoutManager(Context  context,  int  orientation,  boolean  reverseLayout)  {                 super(context,  orientation,  reverseLayout);         }        private  int[]  mMeasuredDimension  =  new  int[2];         @Override         public  void  onMeasure(RecyclerView.Recycler  recycler,  RecyclerView.State  state,                                                     int  widthSpec,  int  heightSpec)  {                final  int  widthMode  =  View.MeasureSpec.getMode(widthSpec);                 final  int  heightMode  =  View.MeasureSpec.getMode(heightSpec);                 final  int  widthSize  =  View.MeasureSpec.getSize(widthSpec);                 final  int  heightSize  =  View.MeasureSpec.getSize(heightSpec);                 Log.i(TAG,  "onMeasure  called.  \nwidthMode  "  +  widthMode                                 +  "  \nheightMode  "  +  heightSpec                                 +  "  \nwidthSize  "  +  widthSize                                 +  "  \nheightSize  "  +  heightSize                                 +  "  \ngetItemCount()  "  +  getItemCount());                 int  width  =  0;                 int  height  =  0;                 for  (int  i  =  0;   i  <   getItemCount();   i++)  {                         measureScrapChild(recycler,  i,                                         View.MeasureSpec.makeMeasureSpec(i,  View.MeasureSpec.UNSPECIFIED),                                         View.MeasureSpec.makeMeasureSpec(i,  View.MeasureSpec.UNSPECIFIED),                                         mMeasuredDimension);                         if  (getOrientation()  ==  HORIZONTAL)  {                                 width  =  width  +  mMeasuredDimension[0];                                 if  (i  ==  0)  {                                         height  =  mMeasuredDimension[1];                                 }                         }  else  {                                 height  =  height  +  mMeasuredDimension[1];                                 if  (i  ==  0)  {                                         width  =  mMeasuredDimension[0];                                 }                         }                 }                 switch  (widthMode)  {                         case  View.MeasureSpec.EXACTLY:                                 width  =  widthSize;                         case  View.MeasureSpec.AT_MOST:                         case  View.MeasureSpec.UNSPECIFIED:                 }                switch  (heightMode)  {                         case  View.MeasureSpec.EXACTLY:                                 height  =  heightSize;                         case  View.MeasureSpec.AT_MOST:                         case  View.MeasureSpec.UNSPECIFIED:                 }                setMeasuredDimension(width,  height);         }        private  void  measureScrapChild(RecyclerView.Recycler  recycler,  int  position,  int  widthSpec,                                                                       int  heightSpec,  int[]  measuredDimension)  {                 try  {                         View  view  =  recycler.getViewForPosition(0); //fix  动态添加时报IndexOutOfBoundsException                        if  (view  !=  null)  {                                 RecyclerView.LayoutParams  p  =  (RecyclerView.LayoutParams)  view.getLayoutParams();                                 int  childWidthSpec  =  ViewGroup.getChildMeasureSpec(widthSpec,                                                 getPaddingLeft()  +  getPaddingRight(),  p.width);                                 int  childHeightSpec  =  ViewGroup.getChildMeasureSpec(heightSpec,                                                 getPaddingTop()  +  getPaddingBottom(),  p.height);                                 view.measure(childWidthSpec,  childHeightSpec);                                 measuredDimension[0]  =  view.getMeasuredWidth()  +  p.leftMargin  +  p.rightMargin;                                 measuredDimension[1]  =  view.getMeasuredHeight()  +  p.bottomMargin  +  p.topMargin;                                 recycler.recycleView(view);                         }                 }  catch  (Exception  e)  {                         e.printStackTrace();                 }  finally  {                 }         } }

        FullyGridLayoutManager:
package  com.example.p010_recycleviewall.recycleviewbiaoge; import  android.content.Context; import  android.support.v7.widget.GridLayoutManager; import  android.support.v7.widget.RecyclerView; import  android.view.View; import  android.view.ViewGroup; /**   *  Created  by  shining  on  2017/1/10  0010.   */ public  class  FullyGridLayoutManager  extends  GridLayoutManager  {        private  int  mwidth  =  0;         private  int  mheight  =  0;         public  FullyGridLayoutManager(Context  context,  int  spanCount)  {                 super(context,  spanCount);         }        public  FullyGridLayoutManager(Context  context,  int  spanCount,  int  orientation,  boolean  reverseLayout)  {                 super(context,  spanCount,  orientation,  reverseLayout);         }        private  int[]  mMeasuredDimension  =  new  int[2];         public  int  getMwidth()  {                 return  mwidth;         }        public  void  setMwidth(int  mwidth)  {                 this.mwidth  =  mwidth;         }        public  int  getMheight()  {                 return  mheight;         }        public  void  setMheight(int  mheight)  {                 this.mheight  =  mheight;         }        @Override         public  void  onMeasure(RecyclerView.Recycler  recycler,  RecyclerView.State  state,  int  widthSpec,  int  heightSpec)  {                 final  int  widthMode  =  View.MeasureSpec.getMode(widthSpec);                 final  int  heightMode  =  View.MeasureSpec.getMode(heightSpec);                 final  int  widthSize  =  View.MeasureSpec.getSize(widthSpec);                 final  int  heightSize  =  View.MeasureSpec.getSize(heightSpec);                 int  width  =  0;                 int  height  =  0;                 int  count  =  getItemCount();                 int  span  =  getSpanCount();                 for  (int  i  =  0;   i  <   count;   i++)  {                         measureScrapChild(recycler,  i,                                         View.MeasureSpec.makeMeasureSpec(i,  View.MeasureSpec.UNSPECIFIED),                                         View.MeasureSpec.makeMeasureSpec(i,  View.MeasureSpec.UNSPECIFIED),                                         mMeasuredDimension);                         if  (getOrientation()  ==  HORIZONTAL)  {                                 if  (i  %  span  ==  0)  {                                         width  =  width  +  mMeasuredDimension[0];                                 }                                 if  (i  ==  0)  {                                         height  =  mMeasuredDimension[1];                                 }                         }  else  {                                 if  (i  %  span  ==  0)  {                                         height  =  height  +  mMeasuredDimension[1];                                 }                                 if  (i  ==  0)  {                                         width  =  mMeasuredDimension[0];                                 }                         }                 }                switch  (widthMode)  {                         case  View.MeasureSpec.EXACTLY:                                 width  =  widthSize;                         case  View.MeasureSpec.AT_MOST:                         case  View.MeasureSpec.UNSPECIFIED:                 }                switch  (heightMode)  {                         case  View.MeasureSpec.EXACTLY:                                 height  =  heightSize;                         case  View.MeasureSpec.AT_MOST:                         case  View.MeasureSpec.UNSPECIFIED:                 }                 setMheight(height);                 setMwidth(width);                 setMeasuredDimension(width,  height);         }        private  void  measureScrapChild(RecyclerView.Recycler  recycler,  int  position,  int  widthSpec,                                                                       int  heightSpec,  int[]  measuredDimension)  {                 if  (position  <   getItemCount())  {                         try  {                                 View  view  =  recycler.getViewForPosition(0); //fix  动态添加时报IndexOutOfBoundsException                                 if  (view  !=  null)  {                                         RecyclerView.LayoutParams  p  =  (RecyclerView.LayoutParams)  view.getLayoutParams();                                         int  childWidthSpec  =  ViewGroup.getChildMeasureSpec(widthSpec,                                                         getPaddingLeft()  +  getPaddingRight(),  p.width);                                         int  childHeightSpec  =  ViewGroup.getChildMeasureSpec(heightSpec,                                                         getPaddingTop()  +  getPaddingBottom(),  p.height);                                         view.measure(childWidthSpec,  childHeightSpec);                                         measuredDimension[0]  =  view.getMeasuredWidth()  +  p.leftMargin  +  p.rightMargin;                                         measuredDimension[1]  =  view.getMeasuredHeight()  +  p.bottomMargin  +  p.topMargin;                                         recycler.recycleView(view);                                 }                         }  catch  (Exception  e)  {                                 e.printStackTrace();                         }                 }         } }

        滚动不灵敏:

        1.可以设置自定义的NoScrollView:
package  com.example.p010_recycleviewall.widget.NoScrollView; import  android.content.Context; import  android.util.AttributeSet; import  android.view.MotionEvent; import  android.view.ViewConfiguration; import  android.widget.ScrollView; public  class  NoScrollView  extends  ScrollView  {      private  int  mTouchSlop;       public  NoScrollView(Context  context)  {             super(context);             init(context);       }      public  NoScrollView(Context  context,  AttributeSet  attrs,  int  defStyle)  {             super(context,  attrs,  defStyle);             init(context);       }      public  NoScrollView(Context  context,  AttributeSet  attrs)  {             super(context,  attrs);             init(context);       }      private  void  init(Context  context)  {             mTouchSlop  =  ViewConfiguration.get(context).getScaledTouchSlop();       }      float  downX;       float  downY;       @Override       public  boolean  onInterceptTouchEvent(MotionEvent  ev)  {             int  action  =  ev.getAction();             switch  (action)  {             case  MotionEvent.ACTION_DOWN:                   downX  =  ev.getX();                   downY  =  ev.getY();                   break;             case  MotionEvent.ACTION_MOVE:                   if  (Math.abs(ev.getX()  -  downX)  >   mTouchSlop)  {                         return  false;                   }                   break;             default:                   break;             }             return  super.onInterceptTouchEvent(ev);       }       }

        2.设置RecycleView:

recyclerView1.setNestedScrollingEnabled(false);

        剩下的就是算法:
//判断条件如果 if  ((mList1.size()-1)%3==0){         //1  4  7  add  2         mList1.add(new  Biaoge_listBean(""));         mList1.add(new  Biaoge_listBean("")); } if  ((mList1.size()-1)%3==1){         //2  5  8  add  1         mList1.add(new  Biaoge_listBean("")); }

        唉~能不能不加班看~都过年了~能不能休息一下~麻蛋~就这吧~

       
Android Studio第二十九期 - RecycleView的表格形式

文章图片

        地址:https://github.com/geeklx/MyApplication/tree/master/p010_recycleviewall/src/main/java/com/example/p010_recycleviewall/recycleviewbiaoge




本文出自 “梁肖技术中心” 博客,请务必保留此出处http://liangxiao.blog.51cto.com/3626612/1890790

    推荐阅读