滚动布局内嵌ViewPager时ViewPager高度无法重绘解决

前言

·····项目中的需求是:屏幕上半部分显示一张图片和一个Edittext、Button,其后显示一个可切换的Tab,tab有3个按钮自然是切换3个列表。就是这个tab+列表,头疼了 好久。
·····一开始我随手用的Tablayout+ViewPager+Fragment实现的,高度写死了才能显示Fragment中列表内容,(原理我不太懂,据说这是个bug,在滚动视图里ViewPager的高度绘制有问题)但是这样似乎一直在绘制这个高度,然后列表的空白越来越大,便研究了几天,无果,向朋友求助,得到了解决。

·····先看一下View结构图:
《滚动布局内嵌ViewPager时ViewPager高度无法重绘解决》

具体步骤

一、上部的Fragment没啥可说的 ,布局一下就行 ,把所需控件放上;
二、下部的Fragment:
xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/white"
android:orientation="vertical">

<android.support.v7.widget.AppCompatTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"
    android:paddingTop="12dp"
    android:text="搜索排行榜"
    android:textColor="@color/black"
    android:textSize="16sp"
    android:textStyle="bold" />

<include layout="@layout/common_tab" />

<com.czh.kuihuajingyingwang.customwidgets.NoScrollViewPager
    android:id="@+id/viewpager"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/tab_root"
    android:layout_marginTop="10dp" />


</RelativeLayout>  

至于java文件,就是填充ListView和ViewPager ,没什么难度,并且代码里有一些请求之类的需要保密,请体谅!
1、先看Viewpager,

public class NoScrollViewPager extends ViewPager {


public NoScrollViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public NoScrollViewPager(Context context) {
    super(context);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int height = 0;
    for (int i = 0; i < getChildCount(); i++) {
        View child = getChildAt(i);
        child.measure(widthMeasureSpec,
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        int h = child.getMeasuredHeight();
        if (h > height)
            height = h;
    }
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(height,
            MeasureSpec.EXACTLY);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

}

,在底部碎片中引用以上Viewpager,当然别忘了加上Tablayout。。
2、准备适配器,适配器里如何填充不重要,反正适配器传个上下文就行,不用传数据集合,
3、然后创建3个xml文件,内各含一个listview,完全相同,标好id避免错乱,分别用getActivity().getLayoutInflater().inflate(R.layout.XXX, null);填充给3个View的实例,然后即刻通过View实例初始化3个listview,用于填充数据,并在填充数据后填充到Viewpager 。填充listview的时候,切记要将同一个适配器的不同实例分别初始化,而不是将同一个实例初始化3次,如果想试试也行,反正我没那么多时间 ,直接用保险的方案了。
三、重头戏来了,activity的配置。首先创建一个Model类,作为填充列表的item,这两个item就是之前做的两个Fragment,上代码:

public class ExtendModel {
public static final int ONE = 0;
public static final int TWO = 1;// 必须从0 开始  递增 否则点击输入框会数组越界

public static final int[] COUNT = {ONE, TWO};

public ExtendModel() {

}

private int Id;

public int getId() {
    return Id;
}

public void setId(int id) {
    Id = id;
}
}

然后直接上activity的代码,相信一个简单的填充列表,大家都能看懂:

public class RankPromotion1Activity extends BaseActivity {

private ListView listView;//放置Fragment的列表

private ArrayList<ExtendModel> fragmentList;// 保存上部下部fragment
private FragBaseAda adapter;// 放置Fragment的适配器

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_extend);
    initData();
    initView();
    initListener();
}

private void initData() {
    fragmentList = new ArrayList<>();
    for (int i = 0; i < 2; i++) {
        ExtendModel model = new ExtendModel();
        model.setId(ExtendModel.COUNT[i]);
        fragmentList.add(model);
    }
}

private void initView() {
    listView = (ListView) findViewById(R.id.listview);
}

private void initListener() {
    adapter = new FragBaseAda(this);
    listView.setFocusable(false);
    listView.setAdapter(adapter);
    adapter.addData(fragmentList);
}

}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_extend"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<include layout="@layout/titlelayout" />

<ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</LinearLayout>

本次列车到此结束,谢谢大家一路配合!欢迎大家加我的qq330132662 进行交流和建议。

    原文作者:芋头丸_
    原文地址: https://www.jianshu.com/p/8218febb045e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞