这是做的项目中一个页面,后期发现在小屏幕手机上存在这么一个问题,在除了viewpager显示的内容以外还有两个功能区需要显示,viewpager显示的空间占的高度比较小,小屏幕上滑动viewpager的listview的时候只有大概一行的高度可以提供滑动和显示,觉得很憋屈,so,优化界面。只选择这个页面的部分代码来说说,ok,show code.
首先用一个ArrayList把几个需要显示的布局界面放入
ArrayList<View> pageViews = new ArrayList<View>();
private int pagerIndex; // 当前页面的指标,用以在切换界面时候调整高度
private int one_height, two_height, three_height; // 用于记录每个页面的计算后的高度
for (int i = 0; i < 3; i++) {
if (i == 0) {// 添加第一个页面Gridview
pageViews.add(inflater.inflate(R.layout.zf_gridview_main, null));
} else if (i == 1) {//添加第二个页面Gridview
pageViews.add(inflater.inflate(R.layout.zf_gridview_main, null));
} else if (i == 2) {// 第3个界面 listview
pageViews.add(inflater.inflate(R.layout.zf_listview_main_layout, null));
}
}
viewPager.setAdapter(new GuidePageAdapter()); //设置页面显示的适配器
viewPager.setOnPageChangeListener(new GuidePageChangeListener()); //viewPager的监听
// 指引页面数据适配器
class GuidePageAdapter extends PagerAdapter {
@Override
public int getCount() {
return pageViews.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView(pageViews.get(arg1));
}
@Override
public Object instantiateItem(View arg0, final int arg1) {
View tempview = pageViews.get(arg1);
if (arg1 == 0) {// 第1个界面
pagerIndex = 1;
gridview1 = (GridView) tempview.findViewById(R.id.gridView1);
getNetDataByType(type); //获取数据的方法,可以忽略不用管
} else if (arg1 == 1) {// 第2个界面
pagerIndex = 2;
gridview2 = (GridView) tempview.findViewById(R.id.gridView1);
getNetDataByType(type); //获取数据的方法,可以忽略不用管
} else if (arg1 == 2) {// 第3个界面
pagerIndex = 3;
listView = (ListView) tempview.findViewById(R.id.listView_data);
getDepartmentsByAreaId(districtId);
}
((ViewPager) arg0).addView(pageViews.get(arg1));
return pageViews.get(arg1);
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
@Override
public void finishUpdate(View arg0) {
}
}
// 获取到数据以后
// 第一个GridView
gridViewAdapter01 = new GridViewAdapter (ABC.this, arrayList); //arrayList是第一个界面获取到的数据解析后生成的一个实体类的ArrayListgridview1.setAdapter(gridViewAdapter01);
setGirdViewHeightBasedOnChildren(gridview1); //设置gridview的高度
setViewPagerHeightBasedOnChildren(viewPager, one_height); //设置这个pagerView的高度
// 第二个GridView
gridViewAdapter02 = new GridViewAdapter (ABC.this, arrayList);
gridview2.setAdapter(gridViewAdapter02);
setGirdViewHeightBasedOnChildren(gridview2); //设置gridview的高度
setViewPagerHeightBasedOnChildren(viewPager, two_height); //设置这个pagerView的高度
// 第三个ListView
listView.setAdapter(department_Adapter);
setListViewHeightBasedOnChildren(listView); //设置listview的高度
setViewPagerHeightBasedOnChildren(viewPager,three_height); //设置这个pagerView的高度
/**
* 计算gridview的高度
*/
public void setGirdViewHeightBasedOnChildren(GridView gridView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = gridView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0, len = (listAdapter.getCount()+3)/4 ; i < len; i++) { //gridview一行显示了四个,所以高度计算的方式需要根据实际情况更改
// listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, gridView);
// 计算子项View 的宽高
listItem.measure(0, 0);
// 统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = gridView.getLayoutParams();
// params.height = totalHeight;
if (pagerIndex == 1) {
one_height = params.height = totalHeight
+ ((gridView.getVerticalSpacing() * (listAdapter.getCount() / 4 - 1)));
} else if (pagerIndex == 2) {
two_height = params.height = totalHeight
+ ((gridView.getVerticalSpacing() * (listAdapter.getCount() / 4 - 1)));
}
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
gridView.setLayoutParams(params);
}
/**
* 计算listview的高度
*/
public void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
// listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
// 计算子项View 的宽高
listItem.measure(0, 0);
// 统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
three_height = params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}
/**
* 计算pagerview的高度
*/
public void setViewPagerHeightBasedOnChildren(ViewPager pagerView,
int height) {
// 获取ListView对应的Adapter
GuidePageAdapter pagerAdapter = (GuidePageAdapter) pagerView
.getAdapter();
if (pagerAdapter == null) {
return;
}
ViewGroup.LayoutParams params = pagerView.getLayoutParams();
params.height = height;
pagerView.setLayoutParams(params);
pagerView.setLayoutParams(params);
}
// 指引页面更改事件监听器
class GuidePageChangeListener implements OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
switch (arg0) { //更换到当前页面就会把计算好的高度传入到更改pagerView高度的方法中,实施更新高度
case 0:
setViewPagerHeightBasedOnChildren(viewPager, one_height);
break;
case 1:
setViewPagerHeightBasedOnChildren(viewPager, two_height);
break;
case 2:
setViewPagerHeightBasedOnChildren(viewPager, three_height);
break;
default:
break;
}
}
}
that's all
以下是xml的部分展示可能需要修改
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:padding="10dp" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:text="办事指南"
android:textColor="@color/zf_black"
android:textSize="18sp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView1"
android:layout_alignBottom="@+id/textView1"
android:layout_alignParentRight="true"
android:paddingRight="10dp"
android:text="点击加载更多相关事项"
android:textColor="#575757"
android:visibility="gone" />
</RelativeLayout>
<View
android:layout_width="fill_parent"
android:layout_height="0.5dp"
android:background="#cccccc" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp" >
<TextView
android:id="@+id/txt_01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/txt_01"
android:gravity="center"
android:paddingBottom="10dp"
android:text="个人"
android:textColor="@color/black" />
<View
android:layout_width="0.5dp"
android:layout_height="fill_parent"
android:layout_marginBottom="10dp"
android:background="#cccccc" />
<TextView
android:id="@+id/txt_02"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="#FFFFFF"
android:gravity="center"
android:paddingBottom="10dp"
android:text="企业"
android:textColor="@color/black" />
<View
android:layout_width="0.5dp"
android:layout_height="fill_parent"
android:layout_marginBottom="10dp"
android:background="#cccccc" />
<TextView
android:id="@+id/txt_03"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="#FFFFFF"
android:gravity="center"
android:paddingBottom="10dp"
android:text="部门"
android:textColor="@color/black" />
</LinearLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="2dp" />
</LinearLayout>
</ScrollView>