完美解決ScrollView巢狀ListView滑動衝突(有圖有真相)
最近在android開發中,需要在ScrollView裡面巢狀ListView,巢狀之後發現滑動衝突。問google問度娘,得出的很多答案都是設定listView的高度,讓所有的item都顯示出來,我覺得這是一種很不好的解決辦法。在試過了很多次之後,發現其實可以通過判斷ListView在螢幕上的座標,如果發生的Touch事件在ListView內,則ScrollView放棄攔截下該時間,把他傳到下一層次的View (ListView)中去處理。
原理:
(轉載請保留原文地址 csdn yang http://blog.csdn.net/lys701/article/details/8755373)
繼承ScrollView,把ListView例項傳到ScrollView中,複寫ScrollView的onInterceptTouchEvent方法, 用getLocationInWindow方法獲取ListView相對於螢幕的位置,呼叫MotionEvent的getRawX和getRawY方法獲取點選事件相對於螢幕的座標,判斷該座標是否發生在ListView的區域內,如果是,則對onInterceptTouchEvent方法直接返回false,關於Touch事件的傳遞方向的問題,網上的文章已經很多了。我就不再陳述,不清楚的可以google.
ScrollView的onTouchEvent不再接收到Event。
部分程式碼:(完整程式碼請下載附件)
自定義的ScollView:
- package com.example.listscrollview;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.view.MotionEvent;
- import android.view.View;
- import android.widget.ListView;
- import android.widget.ScrollView;
- public class ListScrollView extends ScrollView {
- private ListView listView;
- public ListScrollView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- public ListScrollView(Context context) {
- super(context);
- }
- /**
- * 覆寫onInterceptTouchEvent方法,點選操作發生在ListView的區域的時候,
- * 返回false讓ScrollView的onTouchEvent接收不到MotionEvent,而是把Event傳到下一級的控制元件中
- */
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- // TODO Auto-generated method stub
- if (listView != null && checkArea(listView, ev)) {
- return false;
- }
- return super.onInterceptTouchEvent(ev);
- }
- /**
- * 測試view是否在點選範圍內
- * @param locate
- * @param v
- * @return
- */
- private boolean checkArea(View v, MotionEvent event){
- float x = event.getRawX();
- float y = event.getRawY();
- int[] locate = new int[2];
- v.getLocationOnScreen(locate);
- int l = locate[0];
- int r = l + v.getWidth();
- int t = locate[1];
- int b = t + v.getHeight();
- if (l < x && x < r && t < y && y < b) {
- return true;
- }
- return false;
- }
- public ListView getListView() {
- return listView;
- }
- public void setListView(ListView listView) {
- this.listView = listView;
- }
- }
activity的程式碼:
(轉載請保留原文地址 csdn yang http://blog.csdn.net/lys701/article/details/8755373)
- package com.example.listscrollview;
- import java.util.ArrayList;
- import android.os.Bundle;
- import android.app.Activity;
- import android.view.Menu;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- public class MainActivity extends Activity {
- ListScrollView scrollView;
- ListView listView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- scrollView = (ListScrollView) findViewById(R.id.listScrollView);
- listView = (ListView)findViewById(R.id.listView);
- scrollView.setListView(listView);
- String string = "ListItem";
- ArrayList<String> list = new ArrayList<String>();
- for (int i = 0; i < 20; i++) {
- list.add(string + i);
- }
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item, list);
- listView.setAdapter(adapter);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- }
完整程式碼下載地址:http://pan.baidu.com/share/link?shareid=453574&uk=3307773300
相關文章
- ScrollView 與ListView 滑動衝突解決View
- 解決ScrollView巢狀ViewPager出現的滑動衝突問題巢狀Viewpager
- 解決Flutter的ListView巢狀ListView滑動衝突以及無限高度問題FlutterView巢狀
- ScrollView巢狀RecyclerView滑動衝突相關問題View巢狀
- 一種巢狀滑動衝突的解決方案巢狀
- 巢狀UIScrollview的滑動衝突解決方案巢狀UIView
- 一種非巢狀滑動衝突的解決方案巢狀
- 解決ScrollView巢狀RecyclerView滑動卡頓問題View巢狀
- ScrollView巢狀ListView解決辦法以及原理View巢狀
- 重寫ListView解決ListView內部ViewPaper滑動事件衝突問題View事件
- 四種方案解決ScrollView巢狀ListView問題View巢狀
- ScrollView中用ListView的事件衝突View事件
- Scrollview 和 內部 recycleview 高度固定時巢狀衝突的一種解決方法View巢狀
- 解決 ScrollView 巢狀 RecyclerView 時,慣性滑動失效的問題View巢狀
- scrollview 的滑動衝突 viewpager等都適用Viewpager
- iOS 側滑返回手勢與Scrollview衝突的解決辦法iOSView
- 巢狀ScrollView問題解決思路巢狀View
- ListView巢狀GridView解決方案View巢狀
- ScrollView中巢狀GridView,Listview的辦法View巢狀
- onMeasure簡單方法 完美解決ListView與ScollView衝突問題!View
- ScrollView中巢狀ListView,TextView只顯示一行的高度解決方案巢狀TextView
- ListView與ScrollView衝突,計算ListView的高度Item,然後重繪View
- Android View 滑動衝突解決方式以及原理AndroidView
- Android事件分發機制、滑動衝突解決Android事件
- 從原理上說說ScrollView巢狀ListView的問題View巢狀
- RecyclerView 、ViewPager 左右滑動衝突Viewpager
- ViewPager 禁止左右滑動完美解決Viewpager
- 不要在 XML 設定,解決 NestedScrollView 巢狀 RecyclerView 滑動卡頓XMLView巢狀
- RecyclerView與下拉重新整理控制元件滑動衝突的解決View控制元件
- Android-GridView與ScrollView共用的衝突問題(類似ListView)AndroidView
- ScrollView(RecyclerView等)為什麼會自動滾動原理分析,還有阻止自動滑動的解決方View
- ScrollView(RecyclerView等)為什麼會自動滾動原理分析,還有阻止自動滑動的解決方案View
- Android:巢狀滑動總結Android巢狀
- RecyclerView快取原理,有圖有真相View快取
- Android -下拉重新整理,ViewPager和ScrollView巢狀滾動問題解決方案AndroidViewpager巢狀
- Git 解決衝突Git
- git 解決衝突Git
- listview+edittext完美解決方案View