解決ScrollView巢狀ListView不滑動,只顯示一條,ListView滑到頂部問題
阿新 • • 發佈:2019-02-02
問題:在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的排列方式,就能得到想要的樣子啦!!
參考部落格