Android ScrollView 嵌套 ListView、 ListView 嵌套ScrollView Scroll事件冲突解决办法

时间:2023-03-08 15:48:55
Android ScrollView 嵌套 ListView、 ListView 嵌套ScrollView Scroll事件冲突解决办法

本人菜鸟一名,最近工作了,开始学习Android。

最近在做项目的时候,UX给了个design,大概就是下拉刷新的ListView中嵌套了ScrollView,而且还要在ScrollView中添加动画。

在ListView中嵌套使用ScrollView这种方式是不推荐使用的,但是为了满足UX的设计(UX、QA至上,不然BUG绝逼要来)。

为了解决这个问题,菜鸡开始网上查阅资料,但是搜出来的大多是ListView的Item显示不全等解决方案,并没有解决Scroll事件冲突。通过请教同事,最终使用view的requestDisallow方法成功解决。下面是Demo测试的代码

activity_main.xml

 <RelativeLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.test.MainActivity" > <ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView> </RelativeLayout>

list_view_item.xml

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <ScrollView
android:id="@+id/scorll_view"
android:layout_width="match_parent"
android:layout_height="200dp" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" > <ImageView
android:layout_width="match_parent"
android:layout_height="100dp"
android:contentDescription="@null"
android:src="@drawable/ic_launcher" /> <ImageView
android:layout_width="match_parent"
android:layout_height="100dp"
android:contentDescription="@null"
android:src="@drawable/ic_launcher" /> <ImageView
android:layout_width="match_parent"
android:layout_height="100dp"
android:contentDescription="@null"
android:src="@drawable/ic_launcher" /> <ImageView
android:layout_width="match_parent"
android:layout_height="100dp"
android:contentDescription="@null"
android:src="@drawable/ic_launcher" />
</LinearLayout>
</ScrollView> </RelativeLayout>

ScrollViewItemAdatper.java

 package com.example.test;

 import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter; public class ScrollViewItemAdatper extends BaseAdapter { private Context mContext; public ScrollViewItemAdatper(Context context) {
mContext = context;
} @Override
public int getCount() {
return 2;
} @Override
public Object getItem(int arg0) {
return arg0;
} @Override
public long getItemId(int arg0) {
return arg0;
} @Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
if (arg1 == null) {
arg1 = LayoutInflater.from(mContext).inflate(R.layout.list_view_item, null);
}
return arg1;
} }

MainActivity.java

package com.example.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.widget.ListView; public class MainActivity extends Activity { private ListView mListView;
private ScrollViewItemAdatper scrollViewItemAdatper; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.list_view);
scrollViewItemAdatper = new ScrollViewItemAdatper(getBaseContext());
mListView.setAdapter(scrollViewItemAdatper);
} @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
mListView.requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
}

其中最主要的部分在于

 @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
mListView.requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
requestDisallowInterceptTouchEvent这个方法是当前的View获得了touch事件是否截取进行处理,从而消耗掉。如果为true的话,这个View就不进行touch事件的处理,转而抛给其子View进行处理。当然,这个只是用来测试的,所以并没有加上许多判断条件。如果在向上或者向下等某个具体手势是,可以使用
dispatchTouchEvent进行判断即可。