Android之ScrollView
1、ScrollView和HorizontalScrollView是為控件或者布局添加滾動條
2、上述兩個控件只能有一個孩子,但是它并不是傳統意義上的容器
3、上述兩個控件可以互相嵌套
4、滾動條的位置現在的實驗結果是:可以由layout_width和layout_height設定
5、ScrollView用于設置垂直滾動條,HorizontalScrollView用于設置水平滾動條:需要注意的是,有一個屬性是 scrollbars 可以設置滾動條的方向:但是ScrollView設置成horizontal是和設置成none是效果同,HorizontalScrollView設置成vertical和none的效果同。
ScrollView嵌套listView時,listView會產生只能顯示一行的狀況,可以用如下方法解決。
解決方法
方法1:手動設置listView高度
01.public class MainActivity extends Activity { 02. private ListView listView; 03. @Override 04. protected void onCreate(Bundle savedInstanceState) { 05. super.onCreate(savedInstanceState); 06. setContentView(R.layout.activity_main); 07. listView = (ListView) findViewById(R.id.listView1); 08. String[] adapterData = new String[] { "Afghanistan", "Albania",… … "Bosnia"}; 09. listView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,adapterData)); 10. setListViewHeightBasedOnChildren(listView); 11. } 12. public void setListViewHeightBasedOnChildren(ListView listView) { 13. // 獲取ListView對應的Adapter 14. ListAdapter listAdapter = listView.getAdapter(); 15. if (listAdapter == null) { 16. return; 17. } 18. 19. int totalHeight = 0; 20. for (int i = 0, len = listAdapter.getCount(); i < len; i++) { 21. // listAdapter.getCount()返回數據項的數目 22. View listItem = listAdapter.getView(i, null, listView); 23. // 計算子項View 的寬高 24. listItem.measure(0, 0); 25. // 統計所有子項的總高度 26. totalHeight += listItem.getMeasuredHeight(); 27. } 28. 29. ViewGroup.LayoutParams params = listView.getLayoutParams(); 30. params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 31. // listView.getDividerHeight()獲取子項間分隔符占用的高度 32. // params.height最后得到整個ListView完整顯示需要的高度 33. listView.setLayoutParams(params); 34. } 35.}方法2:使用單個ListView取代ScrollView中所有內容
就是說,把整個需要放在ScrollView中的內容,統統放在ListView中,原ListView上方的數據和下方數據,都作為現ListView的一個itemView,和原ListView中的單條數據是平級的關系。
public View getView(int position, View convertView, ViewGroup parent) {//列表第一項if(position == 0){convertView = inflater.inflate(R.layout.item_solution2_top, null);return convertView;}//列表最后一項else if(position == 21){convertView = inflater.inflate(R.layout.item_solution2_bottom, null);return convertView;}//普通列表項ViewHolder h = null;if(convertView == null || convertView.getTag() == null){convertView = inflater.inflate(R.layout.item_listview_data, null);h = new ViewHolder();h.tv = (TextView) convertView.findViewById(R.id.item_listview_data_tv);convertView.setTag(h);}else{h = (ViewHolder) convertView.getTag();}h.tv.setText("第"+ position + "條數據");return convertView; }方法3:使用LinearLayout取代ListView
既然ListView不能適應ScrollView,那就換一個可以適應ScrollView的控件,干嘛非要吊死在ListView這一棵樹上呢?而LinearLayout是最好的選擇。但如果我仍想繼續使用已經定義好的Adater呢?我們只需要自定義一個類繼承自LinearLayout,為其加上對BaseAdapter的適配。 /** * 取代ListView的LinearLayout,使之能夠成功嵌套在ScrollView中 * @author terry_龍 */ public class LinearLayoutForListView extends LinearLayout {private BaseAdapter adapter;private OnClickListener onClickListener = null;/*** 綁定布局*/public void bindLinearLayout() {int count = adapter.getCount();this.removeAllViews();for (int i = 0; i < count; i++) {View v = adapter.getView(i, null, null);v.setOnClickListener(this.onClickListener);addView(v, i);}Log.v("countTAG", "" + count);}public LinearLayoutForListView(Context context) {super(context);}上面的代碼拷貝保存為LinearLayoutForListView.class,或者直接拷貝Demo中的這個類在自己的工程里。我們只需要把原來xml布局文件中的ListView替換為這個類就行了:
<pm.nestificationbetweenscrollviewandabslistview.mywidgets.LinearLayoutForListViewandroid:id="@+id/act_solution_3_mylinearlayout"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical" > </pm.nestificationbetweenscrollviewandabslistview.mywidgets.LinearLayoutForListView>在Activity中也把ListView改成LinearLayoutForListView,就能成功運行了。
mylinearlayout = (LinearLayoutForListView) findViewById(R.id.act_solution_3_mylinearlayout); adapter = new AdapterForListView(this); mylinearlayout.setAdapter(adapter);方法四
自定義可適應ScrollView的ListView
這個方法和上面的方法是異曲同工,方法3是自定義了LinearLayout以取代ListView的功能,但如果我脾氣就是倔,就是要用ListView怎么辦?那就只好自定義一個類繼承自ListView,通過重寫其onMeasure方法,達到對ScrollView適配的效果。
下面是繼承了ListView的自定義類:
三個構造方法完全不用動,只要重寫onMeasure方法,需要改動的地方比起方法3少了不是一點半點…
在xml布局中和Activty中使用的ListView改成這個自定義ListView就行了。代碼就省了吧…
這個方法和方法1有一個同樣的毛病,就是默認顯示的首項是ListView,需要手動把ScrollView滾動至最頂端。
參考鏈接
日積月累:ScrollView嵌套ListView只顯示一行 - 鄭文亮 - 博客園
四種方案解決ScrollView嵌套ListView問題 - Android開發者交流 - 安卓論壇
完成 ,效果如下
總結
以上是生活随笔為你收集整理的Android之ScrollView的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【每日SQL打卡】
- 下一篇: Linux中的chmod详解