android设置可滚动如何设置ListView滚动到底部

00:12 提问
android 的ListView中,如何判断其内容已滚动到最顶部或者最底部?
android 的ListView中,如何判断其内容已滚动到最顶部或者最底部?
按赞数排序
根据这个方法检测:
getListView().setOnScrollListener(new OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(firstVisibleItem==0){
Log.e("log", "滑到顶部");
if(visibleItemCount+firstVisibleItem==totalItemCount){
Log.e("log", "滑到底部");
不知道你是不是要这种效果?
&span style="font-family:Comic Sans MS;"&package com.testS
import android.util.L
import android.view.V
import android.widget.AbsListV
import android.widget.T
import android.widget.AbsListView.OnScrollL
* 滚动至列表底部,读取下一页数据
public class AutoLoadListener implements OnScrollListener{
public interface AutoLoadCallBack {
void execute(String url);
private int getLastVisiblePosition = 0,lastVisiblePositionY=0;
private AutoLoadCallBack
public AutoLoadListener(AutoLoadCallBack callback)
this.mCallback =
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
//滚动到底部
if (view.getLastVisiblePosition() == (view.getCount() - 1)) {
View v=(View) view.getChildAt(view.getChildCount()-1);
int[] location = new
v.getLocationOnScreen(location);//获取在整个屏幕内的绝对坐标
int y=location [1];
Log.e("x"+location[0],"y"+location[1]);
if (view.getLastVisiblePosition()!=getLastVisiblePosition
&& lastVisiblePositionY!=y)//第一次拖至底部
Toast.makeText(view.getContext(), "再次拖至底部,即可翻页",500).show();
getLastVisiblePosition=view.getLastVisiblePosition();
lastVisiblePositionY=y;
else if (view.getLastVisiblePosition()==getLastVisiblePosition
&& lastVisiblePositionY==y)//第二次拖至底部
mCallback.execute("&&&&&拖至底部");
//未滚动到底部,第二次拖至底部都初始化
getLastVisiblePosition=0;
lastVisiblePositionY=0;
public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
主程序为testScroll.java,源码如下:
[java] view plaincopyprint?
&span style="font-family:Comic Sans MS;"&package com.testS
import java.util.ArrayL
import java.util.HashM
import com.testScroll.AutoLoadListener.AutoLoadCallB
import android.app.A
import android.os.B
import android.view.V
import android.widget.AdapterV
import android.widget.AdapterView.OnItemClickL
import android.widget.GridV
import android.widget.SimpleA
import android.widget.T
public class testScroll extends Activity {
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setTitle("精确监听AbsListView滚动至底部----hellogv");
GridView gridview = (GridView) findViewById(R.id.gridview);
// 生成动态数组,并且转入数据
ArrayList&HashMap&String, Object&& lstImageItem = new ArrayList&HashMap&String, Object&&();
for (int i = 0; i & 30; i++) {
HashMap&String, Object& map = new HashMap&String, Object&();
map.put("ItemImage", R.drawable.icon);// 添加图像资源的ID
map.put("ItemText", "NO." + String.valueOf(i));// 按序号做ItemText
lstImageItem.add(map);
// 生成适配器的ImageItem &====& 动态数组的元素,两者一一对应
SimpleAdapter saImageItems = new SimpleAdapter(this, // 没什么解释
lstImageItem,// 数据来源
R.layout.night_item,// night_item的XML实现
// 动态数组与ImageItem对应的子项
new String[] { "ItemImage", "ItemText" },
// ImageItem的XML文件里面的一个ImageView,两个TextView ID
new int[] { R.id.ItemImage, R.id.ItemText });
//添加自动读页的事件
AutoLoadListener autoLoadListener =new AutoLoadListener(callBack);
gridview.setOnScrollListener(autoLoadListener);
// 添加并且显示
gridview.setAdapter(saImageItems);
// 添加消息处理
gridview.setOnItemClickListener(new ItemClickListener());
AutoLoadCallBack callBack=new AutoLoadCallBack(){
public void execute(String url) {
Toast.makeText(testScroll.this, url, 500).show();
// 当AdapterView被单击(触摸屏或者键盘),则返回的Item单击事件
class ItemClickListener implements OnItemClickListener {
public void onItemClick(AdapterView&?& arg0,// The AdapterView where the
// click happened
View arg1,// The view within the AdapterView that was clicked
int arg2,// The position of the view in the adapter
long arg3// The row id of the item that was clicked
// 在本例中arg2=arg3
HashMap&String, Object& item = (HashMap&String, Object&) arg0
.getItemAtPosition(arg2);
// 显示所选Item的ItemText
setTitle((String) item.get("ItemText"));
原文和效果图连接在这里:
其他相似问题
相关参考资料您所在的位置: &
滚动到底部加载更多及下拉刷新listview的使用
滚动到底部加载更多及下拉刷新listview的使用
该ListView优点包括:a. 可自定义下拉响应事件(如下拉刷新)
b.可自定义滚动到底部响应的事件(如滑动到底部加载更多)
c.可自定义丰富的样式
d.高效(若下拉样式关闭不会加载其布局,同listView效率一致) e. 丰富的设置。
本文主要介绍可同时实现下拉刷新及滑动到底部加载更多的ListView的使用。
该ListView优点包括:a. 可自定义下拉响应事件(如下拉刷新) &b.可自定义滚动到底部响应的事件(如滑动到底部加载更多) &c.可自定义丰富的样式
&d.高效(若下拉样式关闭不会加载其布局,同listView效率一致) e. 丰富的设置。
本文可运行APK地址可见,可运行代码地址可见 Code,效果图如下:
1、引入公共库
引入作为你项目的library,或是自己抽取其中的部分使用
2、在layout中定义
将布局中的ListView标签换成cn.mon.view.DropDownListView标签
并加上自定义属性的命名空间xmlns:listViewAttr=&/apk/res/cn.trinea.android.demo&,其中cn.trinea.android.demo需要用自己的包名替换。如何自定义属性及其命名空间可见本文最后。xml代码如下:
&?xml&version=&1.0&&encoding=&utf-8&?&&&RelativeLayout&xmlns:android=&/apk/res/android&&&&&&xmlns:listViewAttr=&/apk/res/cn.trinea.android.demo&&&&&&android:layout_width=&match_parent&&&&&&android:layout_height=&match_parent&&&&&&&&&cn.mon.view.DropDownListView&&&&&&&&&android:id=&@+id/list_view&&&&&&&&&&android:layout_width=&match_parent&&&&&&&&&&android:layout_height=&wrap_content&&&&&&&&&&android:drawSelectorOnTop=&false&&&&&&&&&&android:paddingBottom=&@dimen/dp_40&&&&&&&&&&listViewAttr:isDropDownStyle=&true&&&&&&&&&&listViewAttr:isOnBottomStyle=&true&&&&&&&&&&listViewAttr:isAutoLoadOnBottom=&true&&/&&&/RelativeLayout&&
DropDownListView自定义了三个boolean属性
&declare-styleable&name=&drop_down_list_attr&&&&&&&&attr&name=&isDropDownStyle&&format=&boolean&&/&&&&&&&attr&name=&isOnBottomStyle&&format=&boolean&&/&&&&&&&attr&name=&isAutoLoadOnBottom&&format=&boolean&&/&&&/declare-styleable&&
isDropDownStyle表示是否允许下拉样式,java代码中可自定义下拉listener,表示需要完成的任务
isOnBottomStyle表示是否允许底部样式,java代码中可自定义滚动到底部的listener,表示需要完成的任务
isAutoLoadOnBottom表示是否允许滚动到底部时自动执行对应listener,仅在isOnBottomStyle为true时有效
PS:如果isDropDownStyle或isOnBottomStyle为false,并不会加载对应的布局,所以性能同ListView一样
3、在Java类中调用
通过setOnDropDownListener设置下拉的事件,不过需要在事件结束时手动调用onDropDownComplete恢复状态
通过setOnBottomListener设置滚动到底部的事件,不过需要在事件结束时手动调用onBottomComplete恢复状态,示例代码如下:
&&&&&public&class&DropDownListViewDemo&extends&BaseActivity&{&&&&&private&LinkedList&String&&&&listItems&=&null;&&&&&private&DropDownListView&&&&&listView&&=&null;&&&&&private&ArrayAdapter&String&&&&&&&private&String[]&&&&&&&&&&&&&mStrings&&=&{&&Aaaaaa&,&&Bbbbbb&,&&Cccccc&,&&Dddddd&,&&Eeeeee&,&&&&&&&&&&&&&&Ffffff&,&&Gggggg&,&&Hhhhhh&,&&Iiiiii&,&&Jjjjjj&,&&Kkkkkk&,&&Llllll&,&&Mmmmmm&,&&&&&&&&&&&&&&Nnnnnn&,&&&&&&&&&&&&&&&&&&&&&};&&&&&@Override&&&&&public&void&onCreate(Bundle&savedInstanceState)&{&&&&&&&&&super.onCreate(savedInstanceState,&R.layout.drop_down_listview_demo);&&&&&&&&&listView&=&(DropDownListView)findViewById(R.id.list_view);&&&&&&&&&&&&&&&&&&listView.setOnDropDownListener(new&OnDropDownListener()&{&&&&&&&&&&&&&@Override&&&&&&&&&&&&&public&void&onDropDown()&{&&&&&&&&&&&&&&&&&new&GetDataTask(true).execute();&&&&&&&&&&&&&}&&&&&&&&&});&&&&&&&&&&&&&&&&&&listView.setOnBottomListener(new&OnClickListener()&{&&&&&&&&&&&&&@Override&&&&&&&&&&&&&public&void&onClick(View&v)&{&&&&&&&&&&&&&&&&&new&GetDataTask(false).execute();&&&&&&&&&&&&&}&&&&&&&&&});&&&&&&&&&listItems&=&new&LinkedList&String&();&&&&&&&&&listItems.addAll(Arrays.asList(mStrings));&&&&&&&&&adapter&=&new&ArrayAdapter&String&(this,&android.R.layout.simple_list_item_1,&listItems);&&&&&&&&&listView.setAdapter(adapter);&&&&&}&&&&&private&class&GetDataTask&extends&AsyncTask&Void,&Void,&String[]&&{&&&&&&&&&private&boolean&isDropD&&&&&&&&&public&GetDataTask(boolean&isDropDown){&&&&&&&&&&&&&this.isDropDown&=&isDropD&&&&&&&&&}&&&&&&&&&@Override&&&&&&&&&protected&String[]&doInBackground(Void...&params)&{&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&Thread.sleep(1000);&&&&&&&&&&&&&}&catch&(InterruptedException&e)&{&&&&&&&&&&&&&&&&&;&&&&&&&&&&&&&}&&&&&&&&&&&&&return&mS&&&&&&&&&}&&&&&&&&&@Override&&&&&&&&&protected&void&onPostExecute(String[]&result)&{&&&&&&&&&&&&&if&(isDropDown)&{&&&&&&&&&&&&&&&&&listItems.addFirst(&Added&after&drop&down&);&&&&&&&&&&&&&&&&&adapter.notifyDataSetChanged();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&SimpleDateFormat&dateFormat&=&new&SimpleDateFormat(&MM-dd&HH:mm:ss&);&&&&&&&&&&&&&&&&listView.onDropDownComplete(getString(R.string.update_at)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&dateFormat.format(new&Date()));&&&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&&listItems.add(&Added&after&on&bottom&);&&&&&&&&&&&&&&&&&adapter.notifyDataSetChanged();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&listView.onBottomComplete();&&&&&&&&&&&&&}&&&&&&&&&&&&&super.onPostExecute(result);&&&&&&&&&}&&&&&}&}&
4、高级接口设置
5、样式设置(自定义header和footer信息)
见原文:【编辑推荐】【责任编辑: TEL:(010)】
关于&&&&的更多文章
Android 4.4即将发布,这对大家来说都是很期待的,当然,无论是
既然强大的Android Studio来了,有什么理由不去用呢?
当下移动互联网的发展势头迅猛,各式各样的App也在横
微软和诺基亚终于达成协议,微软将收购诺基亚设备与服
随着秋的到来,各路才子佳人渐渐开始回到学校上课。不
为了满足广大考生的需要,我们组织了参与过多年资格考试命题或辅导的教师,以新的考试大纲为依据,编写了《数据库系统工程师考试
Windows Phone专家
Android开发专家
51CTO旗下网站ListView&使用及自定义效果
ListView使用技巧总结:
(1)解决ListView拖动时背景黑色的问题
我们知道在Android中ListView是一个比较常用的UI控件,我们在大部分开发中都需要用到它,因此Android为我们提供了ListView的多种实现方法。通过自定义显示布局让显示的内容更加美观,但是我们会发现这样一个问题,当我们操作ListView的时候,如果不使用手机上下按键的时候,直接用触摸拖动视图的方式,会发现ListView的背景一片黑色,而且所有被选中的文字都变成一片漆黑。
其实这个问题发生的原因在于ListView存在缓存颜色机制,因此我们可以通过设定缓存颜色为透明的方法来解决这个问题。
A、通过布局属性来设定(ListView的属性中直接定义)
android:cacheColorHint=”#&P
B、在代码中直接设定
listView.setCacheColorHint(Color.TRANSPARENT);
这样就可以解决黑色出现的问题了。
(2)用getDrawingCache方法获取ImageView中的图像需要注意的问题
从ImageView对象中获取图像的方法是什么呢?
从ImageView对象中获取图像的方法,就是ImageView类中的getDrawingCache()方法,比如下面的代码就是从一个ImageView对象iv_photo中获取图像:
Bitmap obmp =
Bitmap.createBitmap(iv_photo.getDrawingCache());
但是需要说明的是:
在调用getDrawingCache()方法从ImageView对象获取图像之前,一定要调用setDrawingCacheEnabled(true)方法:
iv_photo.setDrawingCacheEnabled(true);
否则,无法从ImageView对象iv_photo中获取图像;
在调用getDrawingCache()方法从ImageView对象获取图像之后,一定要调用setDrawingCacheEnabled(false)方法:
iv_photo.setDrawingCacheEnabled(false);
以清空画图缓冲区,否则,下一次从ImageView对象iv_photo中获取的图像,还是原来的图像。
ListView继承于AbsListView。AbsListView用于实现条目的虚拟列表的基类,需要注意几个常用的方法:
android:cacheColorHint
指示该列表总是在固定的单色、不透明的背景下绘制。这允许列表优化其绘制过程
android:drawSelectorOnTop
如果设为真,选择器将绘制在选中条目的上层。否则绘制在下层。默认为假
android:fastScrollEnabled
允许使用快速滚动滑块,可以通过拖动该滑块在列表中快速滚动
android:listSelector
用于在列表中指示当前选中条目的可绘制对象
android:scrollingCache
当为真时,列表滚动使用绘图缓存。该选项使渲染更快,但占用更多的内存。 默认值为真
android:smoothScrollbar
为真时,列表会使用更精确的基于条目在屏幕上的可见像素高度的计算方法。
默认该属性为真,如果你的适配器需要绘制可变高的条目,他应该设为假。 当该属性为真时,你在适配器在显示变高条目时,滚动条的把手会在滚动的
过程中改变大小。当设为假时,列表只使用适配器中的条目数和屏幕上的 可见条目来决定滚动条的属性
android:stackFromBottom
用于 ListView 和 GridView,指示他们的内容栈从底部开始
android:textFilterEnabled
设为真时,列表会过滤根据用户的要求,过滤结果集。列表的适配器必须实现了 Filterable 接口,才能使其可用
android:transcriptMode
设置列表的跳转模式。在跳转模式下,当加入新条目时,列表会滚动到底部, 使新条目可见
自定义ListView特效:
(1)特效1
(2)特性2&可拖拽的ListView
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。[Android] ScrollView滚动到底部和顶部的检测
&&& 很多分页加载的都是继承自ScrollView,分页要检查是否滚动到底部,下拉刷新需要检测是否滚动到顶部。
&SPAN style=&FONT-FAMILY: Microsoft YaH FONT-SIZE: 18px&&&RelativeLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
tools:context=&.MainActivity& &
&ScrollView
android:id=&@+id/scroll_view&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:scrollbars=&vertical& &
&LinearLayout
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:background=&@android:color/darker_gray&
android:orientation=&vertical& &
android:layout_width=&wrap_content&
android:layout_height=&2000dip&
android:text=&text& /&
&/LinearLayout&
&/ScrollView&
&/RelativeLayout&&/SPAN&
&RelativeLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
tools:context=&.MainActivity& &
&ScrollView
android:id=&@+id/scroll_view&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:scrollbars=&vertical& &
&LinearLayout
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:background=&@android:color/darker_gray&
android:orientation=&vertical& &
android:layout_width=&wrap_content&
android:layout_height=&2000dip&
android:text=&text& /&
&/LinearLayout&
&/ScrollView&
&/RelativeLayout&[java] view plaincopyprint?
&SPAN style=&FONT-FAMILY: Microsoft YaH FONT-SIZE: 18px&&public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ScrollView view = (ScrollView) findViewById(R.id.scroll_view);
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
if (v.getScrollY() &= 0) {
Log.d(&scroll view&, &top&);
} else if (view.getChildAt(0).getMeasuredHeight() &= v.getHeight() + v.getScrollY()) {
Log.d(&scroll view&, &bottom&);
Log.d(&scroll view&, &view.getMeasuredHeight() = & + view.getMeasuredHeight()
+ &, v.getHeight() = & + v.getHeight()
+ &, v.getScrollY() = & + v.getScrollY()
+ &, view.getChildAt(0).getMeasuredHeight() = & + view.getChildAt(0).getMeasuredHeight());
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ScrollView view = (ScrollView) findViewById(R.id.scroll_view);
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
if (v.getScrollY() &= 0) {
Log.d(&scroll view&, &top&);
} else if (view.getChildAt(0).getMeasuredHeight() &= v.getHeight() + v.getScrollY()) {
Log.d(&scroll view&, &bottom&);
Log.d(&scroll view&, &view.getMeasuredHeight() = & + view.getMeasuredHeight()
+ &, v.getHeight() = & + v.getHeight()
+ &, v.getScrollY() = & + v.getScrollY()
+ &, view.getChildAt(0).getMeasuredHeight() = & + view.getChildAt(0).getMeasuredHeight());
&&& 检测滚动的时机有很多,这里是在ScrollView外面检测,使用onTouch的MotionEvent.ACTION_MOVE。如果是继承ScrollView,可以在其他回调的时候检测。
&&& v.getScrollY()表示scrollview的上面滚出去的长度。v.getHeight()表示scrollview本身看上去的高度。view.getChildAt(0).getMeasuredHeight()是内容的高度。这里不能用view.getMeasureHeight()。
&&& view.getMeasuredHeight() = 1038
&&& v.getHeight() = 1038
&&& v.getScrollY() = 2962
&&& view.getChildAt(0).getMeasuredHeight() = 4000
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。

我要回帖

更多关于 listview去掉滚动条 的文章

 

随机推荐