1.计算listview高度
设置listview的height为所有item高度的总和,再配合http://blog.yzapp.cn/ScrollView.html 解决ScrollView里嵌套RecyclerView没有惯性滚动
- 优点:
- 简单,滑动流畅
- 缺点:
- listview不能复用view,不适用数据太多的情况
- 不能监听listview的滑动情况,无法判断哪个item消失了
- item高度不统一时listview的height计算复杂
2.使用事件分发机制
自定义ScrollView增加onScrollChanged事件监听,使用ScrollView的onInterceptTouchEvent进行事件拦截,再配合listview的onScrollStateChanged。
// 自定义ScrollView增加onScrollChanged事件监听
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
super.onScrollChanged(x, y, oldx, oldy);
if (scrollViewListener != null) {
scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
}
}
// 使用ScrollView的onInterceptTouchEvent进行事件拦截
/**
* 解决ScrollView里嵌套listview没有惯性滚动,控制ScrollView拦截状态
* mNeedITE listview是否滑倒顶部,可以拦截touch事件
* mNeedITE2 listview是否全屏(scrollView没有滑倒顶部),可以拦截touch事件
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (mNeedITE2 && mNeedITE) {
// listview是否滑倒顶部并且scrollView没有滑倒顶部,拦截touch事件,由scrollView处理滑动
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = ev.getX();
downY = ev.getY();
// 为了让ScrollView获取初始点击坐标,不然会突然跳动
onTouchEvent(ev);
return false;
case MotionEvent.ACTION_MOVE:
if ((Math.abs(ev.getX() - downX) < Util.dip2px(getContext(), 3) && (Math.abs(ev.getY() - downY) < Util.dip2px(getContext(), 3)))
|| Math.abs(ev.getX() - downX) > Math.abs(ev.getY() - downY)) {
// 小距离滑动也是ScrollView响应
onTouchEvent(ev);
// 点击事件不拦截
return false;
}
return true;
default:
return false;
}
} else {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = ev.getX();
downY = ev.getY();
onTouchEvent(ev);
return false;
case MotionEvent.ACTION_MOVE:
if (mNeedITE2 || ((ev.getY() - downY) > 0 && mNeedITE)) {
// scrollView没有滑倒顶部 或者 scrollView滑倒顶,istview也滑倒顶部向下滑 拦截touch事件
onTouchEvent(ev);
return true;
}
return false;
default:
return false;
}
}
}
// listview的onScrollStateChanged
/**
* listView 滑动监听
*/
serviceSon.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
}
@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {
View firstView = absListView.getChildAt(0);
if (firstView != null) {
if (firstView.getTop() >= 0) {
// 滑倒顶部
scrollview.setITE(true, null);
mScrollviewTouch = true;
} else {
scrollview.setITE(false, null);
mScrollviewTouch = false;
}
}
// 改变父类目的选中状态
if (mChooseService.size() > i && !mFathername.equals(mChooseService.get(i).getFathername())) {
mFathername = mChooseService.get(i).getFathername();
}
if (mSonChangeFather) {
for (StoreServiceList storeServiceList : storeService) {
if (storeServiceList.getServiceName().equals(mFathername)) {
storeServiceList.setChoose(true);
} else {
storeServiceList.setChoose(false);
}
}
mFatherAdapt.notifyDataSetChanged();
}
mSonChangeFather = true;
}
});
- 优点:
- 可以监听listview的滑动情况,判断哪个item消失并对父类目的listview进行相应的改变
- 滑动流畅
- 缺点:
- 实现比较复杂
- listview滑倒顶部,再向下滑时需要松下收再向下划(也有解决方法,listview向下滑时时触发ScrollView的onTouch事件,但滑动不流畅而且没有惯性)
3.使用ListView的addHeaderView
使用子listview的addHeaderView,把ScrollView里的其他view放进去,去掉ScrollView。
由于最底下是两个listview并列的,所以需要在HeaderView设置layout_marginRight为负的父listview的宽度。
4.使用support.design包里的,CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout。
简单的例子:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="cn.yzapp.myapplication2.ScrollingActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/app_bar_height"
android:fitsSystemWindows="true"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:layout_collapseMode="parallax"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="80dp"
android:text="dsvf"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="dsvf"/>
</LinearLayout>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_scrolling" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_email"
app:layout_anchor="@id/app_bar"
app:layout_anchorGravity="bottom|end" />
<android.support.design.widget.TabLayout
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="40dp"
app:layout_anchor="@id/app_bar"
app:layout_anchorGravity="bottom|end"
android:background="@android:color/holo_red_dark"/>
</android.support.design.widget.CoordinatorLayout>
此为blog备份,原地址:http://blog.yzapp.cn/store.html