scrollview嵌套viewpager(包含gridview和listvie)

  这是做的项目中一个页面,后期发现在小屏幕手机上存在这么一个问题,在除了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是第一个界面获取到的数据解析后生成的一个实体类的ArrayList
gridview1.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>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值