android -- 小问题 关于ListView设置了OnScrollListener之后onScrollStateChanged()和onScroll方法监听不到的问题

关于ListView设置了OnScrollListener之后onScrollStateChanged()和onScroll方法监听不到的问题:

原因:

首先OnScrollListener是焦点滚动的监听事件,需要有焦点才能响应。如果在ScrollView中内嵌了ListView之后,动态计算了ListView的高度,并予以设置高度,那么这时用户拖动界面,造成的滚动是ScrollView的滚动,而并非ListView的滚动,此时焦点是被ScrollView夺去的,ListView自然就不响应OnScrollListener的监听咯,同样的在模拟器上使用鼠标滚轮滑动ListView导致的不响应OnScrollListener也是如此。

假设和解决办法:

如果此时listView位于ScrollView的最底端,而ListView的上方还有一些数据控件需要显示,而listView又需要动态设置高度且需要完成分页加载的功能,如图所示,该怎么办呢?

不要紧张,办法是有的,接着往下看吧:

1.刚开始我采用监听ScrollView滑动到最底端则加载更多的方式,可是这又导致一个问题,当ScrollView内嵌ListView时候,ListView的notifyDataSetChanged()方法因为需要获取界面资源的原因,在ScrollView中刷新时会导致主线程的卡顿,具体原因不清楚,估计是调用notifyDataSetChanged()方法时,焦点的夺取导致了主线程卡顿,那么这种情况又不行了。

2.接着我想试试能不能自定义ScrollView在内嵌ListView的时候自动把焦点给ListView,可这又牵扯到一个问题,ScrollView的滑动也是需要焦点的。纠结了一段时间后,我认为此解决方式太过麻烦且不通用,一旦遇到别的情况又要重新自定义控件。So,PASS!

最后我使出杀手锏,采用ListView + HeadView + footerView的方式,也就是分成三块,自定义HeadView的显示内容,自定义footerView的显示内容,既简单又通用,完全满足了我的需求,但是这里有一个需要注意的,这种转台(ListView有HeadView的情况下)下给lsitView设置OnItemClickListener,那么OnItemClickListener的一个方法:

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3){

}

此时的点击position应该是arg3,而不是arg2,因为ListView的HeadView会占用一个item。

android -- 小问题 关于ListView设置了OnScrollListener之后onScrollStateChanged()和onScroll方法监听不到的问题

时间: 2024-08-19 23:43:43

android -- 小问题 关于ListView设置了OnScrollListener之后onScrollStateChanged()和onScroll方法监听不到的问题的相关文章

Android downloadmanger 2之对于下载完成和点击下载通知的监听

监听下载完成: 要想在下载完成后收到一个通知,需要注册一个Receiver来接收ACTION_DOWLOAD_COMPLETE广播.它将包含一个EXTRA_DOWNLOAD_ID extra,其中包含了已经完成下载的引用ID: public void funclick(View view){ String serviceString = Context.DOWNLOAD_SERVICE; DownloadManager downloadManager; downloadManager = (Do

Android中如何为ListView设置静态数据

有的时候我们需要为一个listview设置固定的数据,下边就是如何设置静态的数据 布局文件listview 的主页面 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"

Android开发之给ListView设置布局动画效果

1.通过JAVA代码添加,资源文件基本上不修改 XML文件,只添加了一个ListView,就不贴XML文件的代码了. java代码: 1 public class MainActivity extends Activity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.act

Qt实现小功能之列表无限加载(创意很不错:监听滚动条事件,到底部的时候再new QListWidgetItem)

概念介绍 无限加载与瀑布流的结合在Web前端开发中的效果非常新颖,对于网页内容具备较好的表现形式.无限加载并没有一次性将内容全部加载进来,而是通过监听滚动条事件来刷新内容的.当用户往下拖动滚动条或使用鼠标滚轮的时候,页面会自动加载剩余的内容.如下: 简约而不简单,正是这种别出心裁,突破常规的设计才能得到用户的青睐…… 实现思路 在前端开发可以使用一些jQuery插件实现这种效果,后台只需要准备好数据就行了.在Qt中如何给列表组件(QListWidget,QTreeWidget, QTableWi

Android实战简易教程-第四十枪(窃听风云之短信监听)

近期在做监听验证码短信自己主动填入的功能,无意间想到了一个短信监听的办法. 免责声明:短信监听本身是一种违法行为,这里仅仅是技术描写叙述.请大家学习技术就可以.(哈哈) 本实例是基于bmob提供的后台服务,将监听到的短信自己主动上传到bmob数据库中. 一.代码实现: 1.首先实现javabean对象. package com.example.messagecut; import cn.bmob.v3.BmobObject; public class MsgContent extends Bmo

设置休眠时间,获得休眠时间,监听屏幕状态,服务启动界面

public class MyService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { Log.e("zz","zz"); MyService.ScreenListener mScreenListener= new MyService.ScreenListe

ListView的View回收引起的checkbox状态改变监听等问题解决方案

我的ListView中每行View包含一个ImageView.TextView.CheckBox.当ListView中有一个或一个一行CheckBox被选中就让ListView上面的Button显示,否则就隐藏.因此,需要对每行View中的CheckBox设置监听.我使用CheckBox中的OnCheckedChangeListener监听器,当CheckBox的状态发生改变的时候就会触发这个监听器.先看下我自定义给ListView的Adapter的getView方法中的一些关键代码: 这是ge

Android网络开源库-Retrofit(三) 批量上传及上传进度监听

由于gif图太大的原因,我将图放在了github,如果博客中显示不出来图,传送门 由于我是事先写在md上的,导致代码的可读性差,大家将就着看吧. 1. 前言 在上一篇博客中,我们介绍了Retrofit的文件上传,文件下载以及进度监听,这篇博客我们来了解下批量上传以及上传进度的监听. 2.批量上传 要想实现批量上传,我们要考虑下HTML中实现批量上传的方法,借助Form表单,所以,我们也可以通过借助Form表单来实现批量上传. 2.1 HTML FORM 表单的写法 <html> <bod

Android 另类方法监听软键盘的弹出收起事件

http://www.cnblogs.com/csonezp/p/5065624.html 最近做的项目碰到个问题,a界面是fragment+recyclerview,b界面带个edittext,并且会自动获得焦点弹出软键盘.由a界面进入b界面,再结束b界面返回a界面,就会在a界面上留下一片和软键盘大小相同的灰色区域,具体原因搞了很久也不清楚.但是问题总是要解决的,我在a的fragment上折腾了半天,始终没什么用.然后就想着在b界面折腾折腾,关闭activity的时候先收起挼键盘,软键盘收起完