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

2,424 阅读2分钟
原文链接: www.jianshu.com

前言

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


具体步骤

一、上部的Fragment没啥可说的 ,布局一下就行 ,把所需控件放上;
二、下部的Fragment:
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);
}

}

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