zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    打印一个0到1之间的数的二进制表示
    bzoj-3223 文艺平衡树
    Linux下使用fstatfs/statfs查询系统相关信息
    Pku3664
    hdu-2544 最短路
    java同步包种ArrayBlockingQueue类的分析与理解
    【剑指offer】不用加减乘除做加法
    PA模块经常使用表
    网络编程
    // 插入排序 源代码
  • 原文地址:https://www.cnblogs.com/HEWU10/p/4354207.html
Copyright © 2011-2022 走看看