ScrollView中滑动控件

来源:互联网 发布:小米4c可以4g网络吗 编辑:程序博客网 时间:2024/05/22 10:47

场景

ScrollView中嵌套滑动控件。ListView与GridView仅显第一Item,RecyclerView滑动冲突。

解决

ListView与GridView

import android.view.View;import android.view.ViewGroup;import android.widget.GridView;import android.widget.ListAdapter;import android.widget.ListView;public class GetLGViewHeight {    /*    * 动获ListView高    * */    public void setListViewHeightBasedOnChildren(ListView listView) {        ListAdapter listAdapter = listView.getAdapter();        // 适配器判空        if (listAdapter == null) {            return;        }        // 总高        int totalHeight = 0;        for (int i = 0; i < listAdapter.getCount(); i++) {            View listItem = listAdapter.getView(i, null, listView);            listItem.measure(0, 0);            totalHeight += listItem.getMeasuredHeight();        }        ViewGroup.LayoutParams params = listView.getLayoutParams();        params.height = totalHeight                + (listView.getDividerHeight() * (listAdapter.getCount() - 1));        listView.setLayoutParams(params);    }    /*    * 动获GridView高    * */    public static void setGridViewHeightBasedOnChildren(GridView gridView) {        // 获GridView之adapter        ListAdapter listAdapter = gridView.getAdapter();        if (listAdapter == null) {            return;        }        /*        * 固定列宽,列数        * 动获列数        * int col = gridView.getNumColumns();        * */        int col = 5;        int totalHeight = 0;        // i每加gridView.getNumColumns(),相当listAdapter.getCount()小于等于gridView.getNumColumns()时循环一次,计算一次item高        // listAdapter.getCount()小于等于二倍gridView.getNumColumns()时计算两次高相加        for (int i = 0; i < listAdapter.getCount(); i += col) {            // 获gridView每一item            View listItem = listAdapter.getView(i, null, gridView);            listItem.measure(0, 0);            // 获item高和            totalHeight += listItem.getMeasuredHeight();        }        // 获gridView布局参数        ViewGroup.LayoutParams params = gridView.getLayoutParams();        // 设高        params.height = totalHeight;        // 设margin        /*((ViewGroup.MarginLayoutParams) params).setMargins(6, 12, 6, 12);*/        // 设参数        gridView.setLayoutParams(params);    }}

RecyclerView

package util;import android.content.Context;import android.support.v7.widget.GridLayoutManager;import android.util.AttributeSet;/** * Created on 2017/11/19 0019. * * @desc custom gridManager */public class MyGridLayoutManager extends GridLayoutManager {    private boolean scrollEnable = true;    public MyGridLayoutManager(Context context, int spanCount) {        super(context, spanCount);    }    public MyGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {        super(context, attrs, defStyleAttr, defStyleRes);    }    public MyGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {        super(context, spanCount, orientation, reverseLayout);    }    public void setScrollEnable(boolean flag) {        this.scrollEnable = flag;    }    @Override    public boolean canScrollVertically() {        return scrollEnable && super.canScrollVertically();    }}

滑动解决后偶现RecyclerView于安卓6.0显示不全,高权重怎么设仅显一部分。解决方法在RecyclerView外用一RelativeLayout且属性android:descendantFocusability="blocksDescendants"包括。