最近,要在应用中做一个功能,查询SQLite数据库中的记录,用列表进行展示。
关于选择哪种布局,因为考虑到界面上要增加一些筛选条件,界面会稍显复杂,所以就没有继承ListFragment,而是继承了Fragment,并且用了自定义的ListView:
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:id="@+id/fragmentContainer" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:dividerHeight="1px" android:divider="#B8B8B8" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="#B8B8B8" android:dividerHeight="1px" android:divider="#B8B8B8" > <TextView android:id="@+id/title_index" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="序号" android:gravity="center_horizontal" android:textSize="13sp" /> <!--表头 。。。 。。。--> </LinearLayout> <!--ListView主体--> <ListView android:id="@+id/samplelist" android:layout_width="fill_parent" android:layout_height="fill_parent" android:dividerHeight="1px" android:divider="#B8B8B8" > </ListView> </LinearLayout> </ScrollView>
数据库里有30条记录,但运行的时候发现界面上只显示了1条,查看输出的话,发现其实30条记录都查出来的,因此判断问题出在UI层面:
整了半天没整出来,不过,不经意间发现这是一个以前遇到并解决过的问题,原来这是因为ListView处在ScrollView里面之后导致的问题,解决方法如下:
/** * 为了解决ListView在ScrollView中只能显示一行数据的问题 * * @param listView */ public static 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); 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); }
@Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { // Create an adapter to point at this cursor SampleCursorAdapter adapter = new SampleCursorAdapter(getActivity(), (SampleCursor)cursor); lv.setAdapter(adapter); Utils.setListViewHeightBasedOnChildren(lv); }