android 开发-ListView与ScrollView事件冲突处理(事件分发机制处理)

  ListView和ScrollView都存在滚动的效果,所以一般不建议listView和scrollView进行嵌套使用,但有些需求则需要用到两者嵌套。在android的学习中学了一种事件分发处理机制。

  如果listView显示在UI上部,而如imageView等显示在UI下部。

  • 首先为listView注册一个滑动监听事件

    通过为listView设置固定高度,并注册滑动监听事件。在划动监听事件中,记录用户是否滑动至listView数据底部。

  • 通过activity的dispatchTouchEvent()方法进行事件奋发

    通过用户记录的是否滑动到listView底部的值在dispatchTouchEvent()方法中进行事件分发处理。

  UI :

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context=".MainActivity" >
10
11     <ScrollView
12         android:id="@+id/scrollView1"
13         android:layout_width="wrap_content"
14         android:layout_height="wrap_content"
15         android:layout_alignParentLeft="true"
16         android:layout_alignParentTop="true"
17         android:layout_alignParentRight="true"
18         android:layout_alignParentBottom="true"
19         >
20
21         <!-- 滚动布局里只能包含一个线性布局 -->
22         <LinearLayout
23             android:layout_width="match_parent"
24             android:layout_height="match_parent"
25             android:orientation="vertical" >
26
27             <ListView
28                 android:id="@+id/listView1"
29                 android:layout_width="match_parent"
30                 android:layout_height="430dp" >
31             </ListView>
32             <ImageView
33                 android:layout_width="wrap_content"
34                 android:layout_height="wrap_content"
35                 android:src="@drawable/a"/>
36             <ImageView
37                 android:src="@drawable/a"
38                 android:layout_width="wrap_content"
39                 android:layout_height="wrap_content"/>
40             <ImageView
41                 android:src="@drawable/a"
42                 android:layout_width="wrap_content"
43                 android:layout_height="wrap_content"/>
44             <ImageView
45                 android:src="@drawable/a"
46                 android:layout_width="wrap_content"
47                 android:layout_height="wrap_content"/>
48
49         </LinearLayout>
50     </ScrollView>
51
52 </RelativeLayout>

ListView and ScrollView

  Activity :

 1 package com.example.android_listview_and_scrollview;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 import android.app.Activity;
 7 import android.os.Bundle;
 8 import android.view.Menu;
 9 import android.view.MotionEvent;
10 import android.widget.AbsListView;
11 import android.widget.AbsListView.OnScrollListener;
12 import android.widget.ArrayAdapter;
13 import android.widget.ListView;
14 import android.widget.ScrollView;
15 /**
16  * @author xiaowu
17  * NOTE:listView与ScrollView事件冲突处理
18  * 通过Activity的dispatchTouchEvent()方法进行事件分发的处理
19  */
20 public class MainActivity extends Activity {
21     private ListView listView ;
22     private ScrollView scrollView ;
23     private ArrayAdapter adapter ;
24     private boolean is_move ;
25     private boolean is_scroll_move ;
26
27     @Override
28     protected void onCreate(Bundle savedInstanceState) {
29         super.onCreate(savedInstanceState);
30         setContentView(R.layout.activity_main);
31         listView = (ListView)this.findViewById(R.id.listView1);
32         scrollView = (ScrollView)this.findViewById(R.id.scrollView1);
33         adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,getData());
34         listView.setAdapter(adapter);
35         //为listView添加滚动监听事件
36         listView.setOnScrollListener(new OnScrollListener() {
37             @Override
38             public void onScrollStateChanged(AbsListView view, int scrollState) {
39                 // TODO Auto-generated method stub
40                 //屏幕移动到底端,并且手已经离开屏幕(用户从ListView滑动到底端)  。OnScrollListener.SCROLL_STATE_IDLE 表示手离开屏幕
41                 if(is_move && scrollState==OnScrollListener.SCROLL_STATE_IDLE){
42                     //设置移动状态为true
43                     is_scroll_move = true ;
44                 }
45             }
46             @Override
47             public void onScroll(AbsListView view, int firstVisibleItem,
48                     int visibleItemCount, int totalItemCount) {
49                 // TODO Auto-generated method stub
50                 is_move = (firstVisibleItem+visibleItemCount == totalItemCount);
51             }
52         });
53     }
54     public List<String> getData(){
55         List<String> list = new ArrayList<String>();
56         for(int i = 0 ;i<20 ;i++){
57             list.add("ABC"+i);
58         }
59         return list ;
60     }
61     //事件处理机制
62     @Override
63     public boolean dispatchTouchEvent(MotionEvent ev) {
64         // TODO Auto-generated method stub
65         if(ev.getAction()== MotionEvent.ACTION_MOVE){
66             //想让哪个控件先执行,直接调用哪个控件的dispatchTouchEvent()方法
67             //如果已经拖动到listView的底端,将事件分发给ScrollView
68             if(is_scroll_move){
69                 scrollView.dispatchTouchEvent(ev);
70             }else{
71                 listView.dispatchTouchEvent(ev);
72             }
73         }
74         return super.dispatchTouchEvent(ev);
75     }
76
77     @Override
78     public boolean onCreateOptionsMenu(Menu menu) {
79         // Inflate the menu; this adds items to the action bar if it is present.
80         getMenuInflater().inflate(R.menu.main, menu);
81         return true;
82     }
83
84 }
时间: 2024-10-14 07:33:46

android 开发-ListView与ScrollView事件冲突处理(事件分发机制处理)的相关文章

android解决listview与scrollview的冲突、自定义listview的高度以及上下拉刷新

     很多时候我们需要使用listview与嵌套使用,那么问题来了,listview里面自带了 滚动条,而又嵌套在scrollview里面.所以引发了一系列的冲突.listview显示不全. 今天给出一个全新的上下拉刷新与解决冲突的方案. .点击下载下拉刷新上拉加载工具      下载完工具后我们复制粘贴到我们自己的工程里面,使用方式和自定义view一样. 下面贴出代码 看到代码贴如也就这么回事.但是我们注意了,这个时候的listview是包裹在scroll里面的.那么滚动起来肯定不行的..

★android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import COM.Example.Main.R; import COM.Example.Main.stringG

使用LinearLayout实现ListView,解决ListView和ScrollView滚动冲突

在项目中,我们常常会遇到一个ScrollView里面会嵌套ListView的情况,但往往你会发现,ListView和ScrollView的滚动时间会有冲突问题,造成ListView不能完全显示.虽然网上有给出解决方案,但事实上并不好用,并不完美. public void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter ListAdapter listAdapter = listView.g

android 开发-ListView列表显示控件的实现

列表的显示需要三个元素: 1.ListVeiw 用来展示列表的View. 2.适配器 用来把数据映射到ListView上的中介. 3.数据    具体的将被映射的字符串,图片,或者基本组件. 根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter UI: 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android捕获ListView中每个item点击事件

package com.wps.android; import java.util.ArrayList; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListe

Android开发艺术探索(研读笔记)——03-Android中的IPC机制(一)

Android开发艺术探索(研读笔记) 作者:Dimon 微博:@Dimon-喰 GitHub:@Dimon94 LOFTER:@Dimon. 03-Android中的IPC机制(一) 1.Android IPC 简介 IPC(Inter-Process-Communication):含义为进程间通信,指两个进程之间进行数据交换的过程. 什么是进程:一般指一个执行单元,在PC和移动设备上的一个程序或者一个应用. 什么是线程:线程是CPU调度的最小单元,是一种有限的系统资源. 而一个进程可以包含多

.Net程序员玩转Android开发--ListView单击事件

public class ListViewClickActivity extends Activity {         private ListView lv;        SimpleAdapter adp;//定义适配器         private List<map<string,object>> mapList;//定义数据源                      protected void onCreate(Bundle savedInstanceState

Android开发随笔之ScrollView嵌套GridView

在开发过程总遇到ScrollView嵌套GridView,由于这两种控件都带有滚动条,当他们碰到一起的时候便会出问题,问题是gridview不滚动,并且只显示两行,为此看了官方文档,谷歌回答滚动里面没必要再加滚动,不符合UI设计.最后还是找到了网上大牛的解决方案才搞定的. 大概写个demo测试了下,还是能嵌套使用的,提前GridView性能好像降低了.如果加载过多,UI加载变的很卡. 主要xml布局为: <?xml version="1.0" encoding="utf

Android开发学习笔记--给一个按钮定义事件

学习Android的第一天,了解了各种布局,然后自己动手画出了一个按钮,然后给按钮定义了一个事件是弹出一条消息显示“我成功了!”字样,具体过程如下: 1.修改布局文件activity_main.xml加入如下语句(我把原来的那个文本框删掉了) <Button android:id="@+id/button1" android:onClick="button_click" android:layout_width="wrap_content"