日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android RecyclerView和ScrollView嵌套使用

發布時間:2023/12/20 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android RecyclerView和ScrollView嵌套使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們的recyclerView有多個layoutmanager,通過重寫layoutmanager的方法就可以讓recyclerView和ScrollView嵌套了。但是請注意,如果recyclerView很長那么強烈不建議去做嵌套,因為這樣recyclerView會在展示的時候立刻展示所有內容,效率極低。

本文的兩部分代碼來自一個博主的博客,另一個是我自己寫的,正好可以完全適用于現有的layoutmanager。大家需要的話可以試試,應該問題不大。

原博主的demo:https://github.com/Frank-Zhu/AndroidRecyclerViewDemo

1.LinearLayoutManager和ScrollView嵌套

package com.frankzhu.recyclerviewdemo;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;/*** Author: ZhuWenWu* Version V1.0* Date: 2015/2/26 14:15.* Description:* Modification History:* Date Author Version Description* -----------------------------------------------------------------------------------* 2015/2/26 ZhuWenWu 1.0 1.0* Why & What is modified:*/ 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];@Overridepublic 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 動態添加時報IndexOutOfBoundsExceptionif (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 {}} }

2.GridLayoutManager和ScrollView進行嵌套

package com.frankzhu.recyclerviewdemo;import android.content.Context; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup;/*** Author: ZhuWenWu* Version V1.0* Date: 2015/2/26 14:14.* Description:* Modification History:* Date Author Version Description* -----------------------------------------------------------------------------------* 2015/2/26 ZhuWenWu 1.0 1.0* Why & What is modified:*/ public class FullyGridLayoutManager extends GridLayoutManager {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];@Overridepublic 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:}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 動態添加時報IndexOutOfBoundsExceptionif (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();}}} }

3.StaggeredGridLayoutManager和ScrollView進行嵌套

package com.kale.waterfalldemo.extra.RecyclerView;import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; import android.view.ViewGroup;/*** @author Jack Tony* @brief 不規則排列(類似于瀑布流)的布局管理器* @date 2015/4/6*/ public class ExStaggeredGridLayoutManager extends StaggeredGridLayoutManager {public ExStaggeredGridLayoutManager(int spanCount, int orientation) {super(spanCount, orientation);}// 尺寸的數組,[0]是寬,[1]是高private int[] measuredDimension = new int[2];// 用來比較同行/列那個item罪寬/高private int[] dimension;@Overridepublic void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {// 寬的mode+sizefinal int widthMode = View.MeasureSpec.getMode(widthSpec);final int widthSize = View.MeasureSpec.getSize(widthSpec);// 高的mode + sizefinal int heightMode = View.MeasureSpec.getMode(heightSpec);final int heightSize = View.MeasureSpec.getSize(heightSpec);// 自身寬高的初始值int width = 0;int height = 0;// item的數目int count = getItemCount();// item的列數int span = getSpanCount();// 根據行數或列數來創建數組dimension = new int[span];for (int i = 0; i < count; i++) {measureScrapChild(recycler, i,View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), measuredDimension);// 如果是豎直的列表,計算item的高,否則計算寬度//Log.d("LISTENER", "position " + i + " height = " + measuredDimension[1]);if (getOrientation() == VERTICAL) {dimension[findMinIndex(dimension)] += measuredDimension[1];} else {dimension[findMinIndex(dimension)] += measuredDimension[0];}}if (getOrientation() == VERTICAL) {height = findMax(dimension);} else {width = findMax(dimension);}switch (widthMode) {// 當控件寬是match_parent時,寬度就是父控件的寬度case View.MeasureSpec.EXACTLY:width = widthSize;break;case View.MeasureSpec.AT_MOST:break;case View.MeasureSpec.UNSPECIFIED:break;}switch (heightMode) {// 當控件高是match_parent時,高度就是父控件的高度case View.MeasureSpec.EXACTLY:height = heightSize;break;case View.MeasureSpec.AT_MOST:break;case View.MeasureSpec.UNSPECIFIED:break;}// 設置測量尺寸 setMeasuredDimension(width, height);}private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,int heightSpec, int[] measuredDimension) {// 挨個遍歷所有itemif (position < getItemCount()) {try {View view = recycler.getViewForPosition(position);//fix 動態添加時報IndexOutOfBoundsExceptionif (view != null) {RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) view.getLayoutParams();int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec, getPaddingLeft() + getPaddingRight(), lp.width);int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec, getPaddingTop() + getPaddingBottom(), lp.height);// 子view進行測量,然后可以通過getMeasuredWidth()獲得測量的寬,高類似 view.measure(childWidthSpec, childHeightSpec);// 將item的寬高放入數組中measuredDimension[0] = view.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;measuredDimension[1] = view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;recycler.recycleView(view);}} catch (Exception e) {e.printStackTrace();}}}private int findMax(int[] array) {int max = array[0];for (int value : array) {if (value > max) {max = value;}}return max;}/*** 得到最數組中最小元素的下標** @param array* @return*/private int findMinIndex(int[] array) {int index = 0;int min = array[0];for (int i = 0; i < array.length; i++) {if (array[i] < min) {min = array[i];index = i;}}return index;}}

?

總結

以上是生活随笔為你收集整理的Android RecyclerView和ScrollView嵌套使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。