问题:在ScrollView中嵌套ListView,出现的效果是ListView只显示一行,无论高度设置的是match_parent还是wrap_content。五种任你选。
1、设置ListView的高度为固定值
这样ListView可以滑动,整体ScrollVIew也可以滑动。
2、如果给ScrollView设置android:fillViewport=”true”
ListView会显示全还可以滑动,但是ScrollView不能滑动了。
3、写一个方法去计算ListView的高度
public void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
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);
}
这种方法的局限性:
1)、进入界面之后会自动滑到ListView的顶部(我不知道怎么让他回到顶部,给ScrollView添加scrollTo(0,0)也不好用)。
2)、只有ListView中的每个Item均是LinearLayout时可以使用(
只有LinearLayout有measure方法,如果是RelavityLayout会报错)。
4、如果重写ListView
也会直接跳到ListView的顶部,看不见上面的内容。
//自定义ListView时重写该方法
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST));
}
避免方法3和4跳到顶部的办法:
给scrollView设置如下的属性
scrollView.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
5、利用LinearLayout代替ListView
protected BaseAdapter mAdapter;
protected OnClickListener mOnClickListener = null;
public void bindLinearLayout() {
int count = mAdapter.getCount();
for (int i = 0; i < count; i++) {
View v = mAdapter.getView(i, null, null);
v.setOnClickListener(this.mOnClickListener);
addView(v);
}
}
public LinearLayoutForListView(Context context) {
super(context);
init(context);
}
public LinearLayoutForListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
invalidate();
}
public BaseAdapter getAdapter() {
return mAdapter;
}
public void setAdapter(BaseAdapter adpater) {
this.mAdapter = adpater;
bindLinearLayout();
}
public OnClickListener getOnclickListener() {
return mOnClickListener;
}
public void setOnItemClickListener(OnClickListener onClickListener) {
this.mOnClickListener = onClickListener;
}
}
使用的时候和ListView差不多,都需要设置Adapter
mLinearLayoutForListView.removeAllViewsInLayout();
mLinearLayoutForListView.invalidate();
mLinearLayoutForListView.setAdapter(new DeputyProductAdapter(deputyProducts));
这里需要注意一点每个item的布局要是match_parent,否则会默认的水平排列,如果不想是match_parent,还有一种解决方案就是通过setOrientation()方法设置LinearLayout的排列方式,就能得到想要的样子啦!!
参考博客
http://yuweiguocn.github.io/android-scrollview-nested-listview/