码迷,mamicode.com
首页 > 移动开发 > 详细

Android之ScrollView里嵌套ListView

时间:2016-08-12 11:20:27      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:

ScrollView套ListView会存以下两个问题

  1.里面的listView高度无法算出来,通常只能显示listview的其中一行

  2.listview不能滚动

  这里我用的是可展开的(ExpandableListView

解决问题一,如果ExpandableListView是的子项是用写死的布局文件来加载的,只要在设置ListView的Adapter后调用此静态方法即可让ListView正确的显示在其父ListView的ListItem中。但是要注意的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。

 1 public static void setListViewHeightBasedOnChildren(ListView listView) { 
 2         ListAdapter listAdapter = listView.getAdapter();  
 3         if (listAdapter == null) { 
 4             return; 
 5         }   
 6         int totalHeight = 0; 
 7         for (int i = 0; i < listAdapter.getCount(); i++) { 
 8             View listItem = listAdapter.getView(i, null, listView); 
 9             listItem.measure(0, 0); 
10             totalHeight += listItem.getMeasuredHeight(); 
11         }   
12         ViewGroup.LayoutParams params = listView.getLayoutParams(); 
13         params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
14         listView.setLayoutParams(params); 
15 } 

如果ExpandableListView 的子项是用代码来代码动态加载的,那么给每个子项定义一个高度,这个就可以计算整个listview的高度了。代码如下:

先定义子项高度

public static final int ItemHeight = 85;

定义子项的TextView布局

1 static public TextView getTextView(Context context) {
2       AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
3            ViewGroup.LayoutParams.FILL_PARENT, ItemHeight);
4       TextView textView = new TextView(context);
5       textView.setLayoutParams(lp);
6       textView.setTextColor(Color.BLACK);
7       textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
8       return textView;
9   }

然后extends BaseExpandableListAdapter中重写以下方法,其中getChild(groupPosition, childPosition).toString()是从数组中读出来的要显示在子项TextView中的文字。

1    @Override
2    public View getChildView(int groupPosition, int childPosition,
3         boolean isLastChild, View convertView, ViewGroup parent) {
4       TextView textView = getTextView(this.parentContext);
5       textView.setText(getChild(groupPosition, childPosition).toString());
6       textView.setPadding(myPaddingLeft + PaddingLeft, 0, 0, 0);
7       return textView;
8    }

这样,问题一就解决了。

问题二就是ScrollView中嵌套listView后ListView不能进行滑动,只能看到显示出来的ListView一部分,解决办法原理很简单ScrollView有一个方法requestDisallowInterceptTouchEvent(boolean);这个方法是设置是否交出ontouch权限的,如果让外层的scrollview.requestDisallowInterceptTouchEvent(false);那么外层的onTouch权限会失去,这样里面的listview就能拿到ontouch权限了,listView就能滚动了。

  问题是:权限只有一个,要支持两个view都能滚动。监听OnTouch的MotionEvent.ACTION_SCROLL:事件当手指触到listview的时候,让外面的scrollview交出权限,当手指触碰到listview之外的时候,让外面的scrollview重新获得权限。这样ok了。R.id.hlpg_main_lv:是listview对应的id,R.id.hlpg_main_allcontent:是listview之外的布局的id。

  且看代码实现:

 1     case R.id.hlpg_main_lv:
 2            sView.requestDisallowInterceptTouchEvent(false);
 3            break;
 4      case R.id.hlpg_main_allcontent:              
 5            sView.requestDisallowInterceptTouchEvent(true);
 6            break;
 7      default:               
 8            sView.requestDisallowInterceptTouchEvent(true);
 9            break;
10                      

这样之后第二个问题也就解决了。

Listview中还提供了对listView滚动的监听,设置这些监听便可以做一些相应的操作

 1 expandableListView.setOnScrollListener(new OnScrollListener() {
 2         @Override
 3         public void onScrollStateChanged(AbsListView view, int scrollState) {
 4            switch (scrollState) {   // 当不滚动时
 5            case OnScrollListener.SCROLL_STATE_IDLE:
 6               // TODO coding here dosometing
 7               break;
 8            }
 9         }      
10         @Override
11         public void onScroll(AbsListView view, int firstVisibleItem,
12               int visibleItemCount, int totalItemCount) {
13             // TODO coding here dosometing
14         }
15       });

这个问题是在开发过程中遇到的,最初想着用其它方式来实现,发现越做越复杂还达不到想要的效果,最后翻阅资料才发现可以来切换ScrollView和ListView之间的OnTouch焦点实现嵌套滑动,希望这个技术分享解决大家遇到的同类问题

 

Android之ScrollView里嵌套ListView

标签:

原文地址:http://www.cnblogs.com/falzy/p/5763895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!