2013年6月18日
打开很久没有更新的博客,看到几年前的自己,感慨万千,无意中也发现了这篇文章,在后来的开发也同样遇到这样的问题,但是有好新的方案,整个程序还是使用ListView,而不用Scrollview进行嵌套, 使用在ListView增加头布局和底布局来进行界面的布局
举个例子:
在main文件声明一个ListView
hallRecommandList=(ListView) this.findViewById(R.id.hall_recommand_list);
声明头布局文件:
<!--
ListView在推荐好友下,增加头文件的View
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical" >
<ImageView
android:id="@+id/recommand"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/hall_ad_ex" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="84dp"
android:layout_marginTop="5dp"
android:background="@drawable/registerbg"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="5dp"
android:background="@drawable/hall_ad_ex2" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/hall_ad_ex2" />
</LinearLayout>
</LinearLayout>
在主Activity中定义方法, 初始化布局addHeaderView() 是把布局加入ListView头,相应的Click按钮是响应事件
private void getHallListHeader() {
LayoutInflater inflater = LayoutInflater.from(this);
View view = inflater.inflate(R.layout.hall_recommand_list_header, null);
hallRecommandList.addHeaderView(view);
ImageView recommand = (ImageView) view.findViewById(R.id.recommand);
recommand.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("44444444444444");
}
});
}
今天在开发自由行项目的详情介绍模版, 老板说,要重新修改界面,为了复用原来的代码,发现一个问题scrollview内无法实现嵌套ListView,的警告提示,ListView的内容只能实现第一列的内容显示.
到网上查看了资料发现:有解决方法,把它记录下来,方便以后查找
在listview.setAdapter()之后调用Utility.setListViewHeightBasedOnChilren(listview)就Okay 了。
public class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
//获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) { //listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0); //计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); //统计所有子项的总高度
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
//listView.getDividerHeight()获取子项间分隔符占用的高度
//params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}
}