关于LiseView ScrollView 问题

转载 2015年07月09日 19:04:31

 

参考:http://www.cnblogs.com/zhwl/p/3333585.html

 

在开发的过程当中,由于手机屏幕的大小的限制,我们经常需要使用滑动的方式,来显示更多的内容。在最近的工作中,遇见一个需求,需要将ListView嵌套到ScrollView中显示。于是乎有了如下布局: 

 

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  2.     xmlns:tools="http://schemas.android.com/tools"   
  3.     android:layout_width="match_parent"   
  4.     android:layout_height="match_parent"   
  5.     android:background="#FFE1FF"   
  6.     android:orientation="vertical" >   
  7.     <ScrollView   
  8.         android:layout_width="match_parent"   
  9.         android:layout_height="match_parent" >   
  10.         <LinearLayout   
  11.             android:layout_width="match_parent"   
  12.             android:layout_height="match_parent" >   
  13.             <ListView   
  14.                 android:id="@+id/listView1"   
  15.                 android:layout_width="match_parent"   
  16.                 android:layout_height="match_parent"   
  17.                 android:fadingEdge="vertical"   
  18.                 android:fadingEdgeLength="5dp" />   
  19.         </LinearLayout>   
  20.     </ScrollView>   
  21. </LinearLayout> 

运行程序,无论你如何调整layout_width,layout_height属性,ListView列表只显示一列 

在查阅的各种文档和资料后,发现在ScrollView中嵌套ListView空间,无法正确的计算ListView的大小,故可以通过代码,根据当前的ListView的列表项计算列表的尺寸。实现代码如下: 

 

[java] view plaincopy
  1. public class MainActivity extends Activity {   
  2.     private ListView listView;   
  3.     @Override   
  4.     protected void onCreate(Bundle savedInstanceState) {   
  5.         super.onCreate(savedInstanceState);   
  6.         setContentView(R.layout.activity_main);   
  7.         listView = (ListView) findViewById(R.id.listView1);   
  8.         String[] adapterData = new String[] { "Afghanistan""Albania",… … "Bosnia"};   
  9.         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(00);    
  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. }   
运行结果,OK问题搞定,打完收工 

 

 

附上 crollView内自定义控件左右滑动不受影响自定义控件:

public class MyScrollView extends ScrollView {

 public MyScrollView(Context context) {
  super(context);
  mGestureDetector = new GestureDetector(new YScrollDetector());
  setFadingEdgeLength(0);
 }

 public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  mGestureDetector = new GestureDetector(new YScrollDetector());
  setFadingEdgeLength(0);
 }

 public MyScrollView(Context context, AttributeSet attrs) {
  super(context, attrs);
  mGestureDetector = new GestureDetector(new YScrollDetector());
  setFadingEdgeLength(0);
 }

 private GestureDetector mGestureDetector;
 View.OnTouchListener mGestureListener;

 @Override
 public boolean onInterceptTouchEvent(MotionEvent ev) {
  return super.onInterceptTouchEvent(ev)
    && mGestureDetector.onTouchEvent(ev);
 }

 class YScrollDetector extends SimpleOnGestureListener {
  @Override
  public boolean onScroll(MotionEvent e1, MotionEvent e2,
    float distanceX, float distanceY) {
   if (distanceY != 0 && distanceX != 0) {

   }
   if (Math.abs(distanceY) >= Math.abs(distanceX)) {
    return true;
   }
   return false;
  }
 }
}

 

 

 

 

 

 

 

 

NGUI:一个可以截断的ScrollView

一个可以截断的UIScrollView。      有一天美术给了我一张UI界面的效果图,在我原本是滚动框的中间放了个大按钮,这就导致了我这个地方不能用再用滚动框了,于是我就想能不能把这个滚动框截...
  • mutou_222
  • mutou_222
  • 2017年02月14日 23:03
  • 386

iOS 浅谈ScrollView的约束。

在iOS开发中,不免会用的ScrollView,但要在scrollview中添加子控件,并给他设置约束,会出现很多问题。下面,给大家讲下博主对这方面的理解。 1。首先,我们都知道,一个控件的位置和...
  • qq_16844001
  • qq_16844001
  • 2016年04月27日 21:01
  • 2104

scrollview注意事项

scrollview只能有一个子控件,如果由于多个线性布局,则用一个大线性布局包起来...
  • xiyangyang8110
  • xiyangyang8110
  • 2017年01月18日 16:09
  • 427

自定义继承ListView控件实现下拉刷新底部加载的实现

实现的功能:自定义控件实现顶部下拉刷新,底部加载更多的功能。 实现的过程:首先自定义一个控件RefreshListView让其自定义ListView,然后分别创建RefreshListView的头部...
  • dzh_19950513
  • dzh_19950513
  • 2016年05月20日 01:20
  • 242

处理ScrollView占据布局的焦点问题

ScrollView控件会占据布局的焦点,如果不希望ScrollView控件占据布局的焦点,可以在布局文件的根目录下添加: android:focusableInTouchMode="true" ...
  • aiguoguo000
  • aiguoguo000
  • 2016年08月26日 11:31
  • 1564

解决 ScrollView 嵌套 ListView 时,高度不正常和滑动冲突的问题

我们在用ScrollView嵌套ListView会两个问题,一个问题是ListView高度不正常,另外一个问题是ListView无法滑动。下面我们就来看看这两个问题怎么解决吧。 第一个问题 Lis...
  • u010261933
  • u010261933
  • 2017年01月13日 15:52
  • 1134

Scrollview嵌套Recyclerview出现的问题解决办法

解决了Scrollview嵌套Recyclerview出现的滑动卡顿和显示不完全的问题
  • qq_36773157
  • qq_36773157
  • 2017年08月11日 16:20
  • 457

ScrollView上添加多个ViewController

今天在搭建项目的时候碰到一个相对内容较多的页面,类似如下图片,产品图片、主要参数、交易条件都有内容。 碰到问题:在进行搭建时碰到Block传值阻塞问题,在其中 一个页面的viewWillAp...
  • XingXingRainLove
  • XingXingRainLove
  • 2016年09月07日 10:01
  • 2235

【菜鸟学安卓】- ScrollView嵌套ListView的问题 OOM

ScrollView嵌套ListView时会有一个问题,就是ListView只会显示一个item,ListView同时也失去了滑动的功能。 对于此问题的答案 第一种是在setAdapter之后重写...
  • wduj123
  • wduj123
  • 2016年05月05日 18:36
  • 680

Android ScrollView中嵌套ListView,滑动冲突问题的解决

在项目开发过程,遇到ScrollView中嵌套ListView,结果点击ListView上下滑动时,整个页面滑动,也就是滑动事件被ScrollView消费掉了,造成listView无法滑动的结果,然后...
  • androidforwell
  • androidforwell
  • 2016年09月22日 13:01
  • 3240
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于LiseView ScrollView 问题
举报原因:
原因补充:

(最多只允许输入30个字)