前言
·····项目中的需求是:屏幕上半部分显示一张图片和一个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 进行交流和建议。