结合listview、适配器adapter、sqlite动态显示sqlite数据库的内容,但一直只能显示一行,调试了半天,分别检查sqlite和commodityList都没有错,只能是getview里出错了,最后百度后发现,在侧栏中用了scrollview嵌套listview,是不兼容的,解决方法有二:
一:
1.动态计算listview的高度
/**
* 动态设置ListView的高度
* @param listView
*/
private void setListViewHeightBasedOnChildren(ListView listView) {
if(listView == null)
return;
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
说明:这个方法的话,item必须是LinearLayout,是利用LinearLayout的measure()方法来测量的,可以在子项比较少的时候用。太多的话,不适合。另外,会有个小问题:显示的时候先显示的是listview的首项,而不是scrollview的顶部。所以,视图实例后现将scrollview滑动到顶端。如下代码:
scrollview = (ScrollView) findViewById(R.id.scrollview);
scrollview.smoothScrollTo(0, 0);
2.自定义listview重写onMeasure()方法
public class ListViewForScrollView extends ListView {
public ListViewForScrollView(Context context) {
super(context);
}
public ListViewForScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ListViewForScrollView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
二:
不用listview,用scrollview与sqlite结合也能做出相同的效果