ScrollView嵌套ListView
2016-05-13 09:57
211 查看
ScrollView嵌套ListView出现的最多的问题主要有两个:
是数据不管有多少条,只能显示一条
当触摸listview时整个scrollview都滑动,出现冲突
解决的办法是:
自定义listview计算listview的高度
重写事件分发三个方法
MainActivity中的代码实现
自定义listview,解决触摸事件
是数据不管有多少条,只能显示一条
当触摸listview时整个scrollview都滑动,出现冲突
解决的办法是:
自定义listview计算listview的高度
重写事件分发三个方法
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.example.test_scrollview.MyListView android:id="@+id/lv_list" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="match_parent" android:layout_height="50dp" android:background="#fbfbfb" android:gravity="center_vertical" android:text="我是占位的" /> <TextView android:layout_width="match_parent" android:layout_height="50dp" android:background="#fbfbfb" android:gravity="center_vertical" android:text="我是占位的" /> </LinearLayout> </ScrollView>
MainActivity中的代码实现
package com.example.test_scrollview; import java.util.ArrayList; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.MeasureSpec; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.ArrayAdapter; import android.widget.ListAdapter; import android.widget.ListView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lv_list=(ListView) findViewById(R.id.lv_list); ArrayList<String> list=new ArrayList<String>(); for (int i = 0; i < 50; i++) { list.add("张三"+i); } //设置适配器 lv_list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list)); //计算listview的高度 setListViewHeightBasedOnChildren(lv_list); //当条目滑到到最后一条的时候,scrollview自动滑动 lv_list.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(list.size()-1==view.getLastVisiblePosition()){ lv_list.getParent().requestDisallowInterceptTouchEvent(false); }else{ lv_list.getParent().requestDisallowInterceptTouchEvent(true); } } }); } /** * 计算listview的高度 */ @SuppressWarnings("deprecation") private void setListViewHeightBasedOnChildren(ListView lv_list) { int totalHeight=0; //得到适配器 @SuppressWarnings("rawtypes") ArrayAdapter listAdapter = (ArrayAdapter) lv_list.getAdapter(); if (listAdapter == null) { return; } //遍历listAdapter 计算出条目的总高度 for (int i = 0; i < listAdapter.getCount(); i++) { //得到每个条目 View listItem = listAdapter.getView(i, null, lv_list); if(listItem!=null) { listItem.setLayoutParams(new LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); listItem.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); //无束缚测量 //累加每个条目的高度 totalHeight+=listItem.getMeasuredHeight(); } } ViewGroup.LayoutParams params = lv_list.getLayoutParams(); //listview的总高度=条目高度+分割线高度+上下边距高度 params.height=totalHeight+(lv_list.getDividerHeight()*(listAdapter.getCount()-1))+lv_list.getPaddingTop()+lv_list.getPaddingBottom(); //得到屏幕的总高度 int height = getWindowManager().getDefaultDisplay().getHeight(); //判断如果listview的高度大于屏幕的一半,就显示屏幕的一半 if(params.height>height/2) { params.height=height/2+200; } lv_list.setLayoutParams(params); } }
自定义listview,解决触摸事件
package com.example.test_scrollview; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ListView; public class MyListView extends ListView { public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public MyListView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public MyListView(Context context) { super(context); } /** *分发 */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { //请求父Scrollview不截断touch事件,因为Scrollview也有滚动效果) getParent().requestDisallowInterceptTouchEvent(true); System.out.println(getParent()+"---------------"); return super.dispatchTouchEvent(ev); } /** *处理事件 */ @Override public boolean onTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub return super.onTouchEvent(ev); } /** *拦截事件 */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub return super.onInterceptTouchEvent(ev); } }
相关文章推荐
- cacti function
- 如何学习新技术
- 如何学习新技术
- Java定时调度 Timer类和TimerTask类
- 通用的erlang优化设置
- 如何学习新技术
- 如何撤消当前提交
- html页面高度不同浏览器兼容性设置
- Linux 自动同步服务器时间
- Timer定时器
- Ping百度自动提交网址
- c# Bitmap byte[]互转
- codeforces 672C Recycling Bottles (枚举+贪心)
- 【BZOJ4430】[Nwerc2015]Guessing Camels赌骆驼【树状数组】【或CDQ分治】
- BIO、NIO的区别
- googleNet
- 表单上传文件
- POJ2752 KMP中next数组的应用
- POJ 2785 4 Values whose Sum is 0(折半枚举)
- 蓝桥杯 剪格子(DFS)