`
dengyin2000
  • 浏览: 1225110 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

判断ListView或者是ScrollView滚动到底部的方法。

阅读更多
ListView

OnScrollListener分析

ListView.setOnScrollListener(new OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        switch (scrollState) {
            case OnScrollListener.SCROLL_STATE_IDLE:
                Log.v("已经停止:SCROLL_STATE_IDLE");
                break;
            case OnScrollListener.SCROLL_STATE_FLING:
                Log.v("开始滚动:SCROLL_STATE_FLING");
                break;
            case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
   Log.v("正在滚动:SCROLL_STATE_TOUCH_SCROLL");
                break;
            }
    }
 
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
           int visibleItemCount, int totalItemCount) {
    }
});


// 监听listview滚到最底部
mIndexList.setOnScrollListener(new OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        switch (scrollState) {
            // 当不滚动时
            case OnScrollListener.SCROLL_STATE_IDLE:
                // 判断滚动到底部
                if (view.getLastVisiblePosition() == (view.getCount() - 1)) {
                    isLastisNext++;
              }
              break;
        }
    }
 
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
           int visibleItemCount, int totalItemCount) {
    }
});



ScrollView 需要覆盖一个新的类LazyScrollView


package com.dodowaterfall;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ScrollView;

public class LazyScrollView extends ScrollView {
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        onScrollListener.onAutoScroll(l, t, oldl, oldt);
    }

    private static final String tag = "LazyScrollView";
    private Handler handler;
    private View view;

    public LazyScrollView(Context context) {
        super(context);

    }

    public LazyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public LazyScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

    // 这个获得总的高度
    public int computeVerticalScrollRange() {
        return super.computeHorizontalScrollRange();
    }

    public int computeVerticalScrollOffset() {
        return super.computeVerticalScrollOffset();
    }

    private void init() {

        this.setOnTouchListener(onTouchListener);
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {

                super.handleMessage(msg);
                switch (msg.what) {
                    case 1:
                        if (view.getMeasuredHeight() - 60 <= getScrollY()
                                + getHeight()) {
                            if (onScrollListener != null) {
                                onScrollListener.onBottom();
                            }

                        } else if (getScrollY() == 0) {
                            if (onScrollListener != null) {
                                onScrollListener.onTop();
                            }
                        } else {
                            if (onScrollListener != null) {
                                onScrollListener.onScroll();
                            }
                        }
                        break;
                    default:
                        break;
                }
            }
        };

    }

    OnTouchListener onTouchListener = new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    break;
                case MotionEvent.ACTION_UP:
                    if (view != null && onScrollListener != null) {
                        handler.sendMessageDelayed(handler.obtainMessage(1), 200);
                    }
                    break;
                default:
                    break;
            }
            return false;
        }

    };

    /**
     * 获得参考的View,主要是为了获得它的MeasuredHeight,然后和滚动条的ScrollY+getHeight作比较。
     */
    public void getView() {
        this.view = getChildAt(0);
        if (view != null) {
            init();
        }
    }

    /**
     * 定义接口
     *
     * @author admin
     */
    public interface OnScrollListener {
        void onBottom();

        void onTop();

        void onScroll();

        void onAutoScroll(int l, int t, int oldl, int oldt);
    }

    private OnScrollListener onScrollListener;

    public void setOnScrollListener(OnScrollListener onScrollListener) {
        this.onScrollListener = onScrollListener;
    }
}


 
      waterfall_scroll.setOnScrollListener(new LazyScrollView.OnScrollListener() {

            @Override
            public void onTop() {
                // 滚动到最顶端
                Log.d("LazyScroll", "Scroll to top");
            }

            @Override
            public void onScroll() {
                if (menu_block.getVisibility() == View.VISIBLE) {
                    menu_block.setVisibility(View.GONE);
                }
            }

            @Override
            public void onBottom() {
                // 滚动到最低端
                // AddItemToContainer(++current_page, page_count);
            }

            @Override
            public void onAutoScroll(int l, int t, int oldl, int oldt) {

                Log.d("MainActivity",
                        String.format("%d  %d  %d  %d", l, t, oldl, oldt));

                // Log.d("MainActivity", "range:" + range);
                // Log.d("MainActivity", "range-t:" + (range - t));
                int scrollHeight = t;
                scroll_height = waterfall_scroll.getMeasuredHeight();
                Log.d("MainActivity", "scroll_height:" + scroll_height);

                int longHeight = waterfall_scroll.getChildAt(0).getMeasuredHeight();
                Log.d("MainActivity", "height:" + longHeight);

                // 当滚到底部时  马上加载
                if (scrollHeight + scroll_height >= longHeight - 40) {
                    if (!isFetchingNow && !noMoreProducts) {
                        new FetchAsyncTask(false).execute();
                        bottom_bar.setVisibility(View.VISIBLE);
                    }
                }
          }
     }
分享到:
评论

相关推荐

    解决scrollView和listview滚动冲突,实现listview滑动到顶端和底部之后还能拖拽一定的距离,松开后返回

    2. **自定义布局**:创建一个自定义的ScrollView,重写其`onInterceptTouchEvent`和`onTouchEvent`方法,当检测到ListView需要滚动时,将触摸事件传递给ListView。同样,ListView也需要相应地调整事件处理逻辑。 3....

    android ScrollView和ListView固定底部

    这样,当ListView滚动到顶部时,ScrollView会继续滚动,显示其内部的其他内容,而底部的视图始终保持在屏幕下方。 为了进一步优化,我们可以使用Header和Footer的概念来添加额外的视图。ListView允许我们添加头部和...

    ScrollView嵌套ListView滑动冲突的解决方法

    通过监听滑动事件,可以在代码中动态判断是应该让ScrollView滚动还是让ListView滚动。例如,可以创建一个滑动手势监听器,当滑动方向符合ScrollView滚动时,处理ScrollView的滚动,否则处理ListView的滚动。 6. **...

    android中scrollview与listview共存

    例如,当ScrollView滚动到底部时,可以自动加载ListView的更多数据。 现在,让我们看看提供的`ListViewTest`项目。这个项目可能包含了实现ScrollView和ListView共存的一个示例。导入Eclipse后,你可以查看代码,...

    Listview与Scrollview冲突的问题

    2. **自定义ListView**:重写ListView的onMeasure()方法,让其高度适应内容高度,这样ScrollView就不会试图对其进行滚动。 3. **避免嵌套**:尽量避免在同一个布局中同时使用ListView和ScrollView。如果内容可以被...

    ListView/ScrollView的header或footer,当向下滚动时消失,向上滚动时出现

    在Android开发中,ListView和ScrollView是两种常用的布局控件,用于展示可滚动的内容。当我们需要在这些组件的顶部或底部添加固定头(header)或尾(footer)部视图时,有时希望它们在用户滚动屏幕时能有特殊的效果...

    解决ListView 和 ScrollView 共存冲突的问题

    例如,当ScrollView滑动到底部时,可以禁用其滚动,让ListView继续接收触摸事件。 7. **使用Headerview和Footerview**: 如果只是想在ListView上方或下方添加可滚动的内容,可以使用ListView的Headerview和...

    Android ScrollView嵌套ListView嵌套GridView的上下拉以及加载更多

    在ListView中,我们可以在数据达到一定数量或者到底部时,调用addFooterView方法添加这个Footer,并在数据加载完成后移除它。对于GridView,过程类似,只是需要确保Footer视图的宽度和高度与单元格相匹配,以保持...

    ScrollView中嵌套ListView的例子

    用户可能无法滚动到ScrollView的底部,或者滚动体验不流畅。 解决这个问题的一种常见方法是使用NestedScrollView替代普通的ScrollView。NestedScrollView是Android Support Library中提供的一个组件,它支持嵌套...

    嵌套ListView的ScrollView实现上拉和下拉

    1. **嵌套滚动**: 当一个ScrollView包含一个ListView或者其他的可滚动视图时,就会出现嵌套滚动的情况。Android提供了`NestedScrolling`接口来处理这种情况,它允许子视图将滚动事件传递给父视图,使得两者可以协同...

    关于多个ListView与ScrollView滑动冲突的一个简单处理方法

    当ListView滚动到底部或顶部时,切换标志,使得ScrollView开始处理滑动。 4. **使用第三方库** 第三方库如`androidx.core.widget.NestedScrollView`(AndroidX库)和`SwipeRefreshLayout`提供了更好的滑动交互体验...

    listview和scrollview的嵌套

    例如,当ScrollView滚动到底部时,可以让ListView接管滚动,反之亦然。这需要对滚动事件有深入理解,代码量较大,且需要根据实际需求调整。 4. **单独处理ScrollView和ListView**:在某些情况下,可以将ScrollView...

    ScrollView嵌套ListView刷新

    2. **使用Header和Footer**:如果只是想在ListView顶部或底部添加一个固定的ScrollView,可以考虑使用ListView的addHeaderView()和addFooterView()方法,将ScrollView作为头部或尾部添加,这样就不需要嵌套,避免了...

    四种方法解决ScrollView嵌套Listview

    在Android开发中,ScrollView和ListView的嵌套是一个常见的需求,但也是一个挑战,因为它们都是滚动视图,直接组合可能导致冲突和不可预期的行为。本篇文章将详细介绍四种解决ScrollView嵌套ListView问题的方法,...

    Android平台下使用ScrollView滚动效果代码

    在Android中,可以重写onScrollChanged()方法来监听ScrollView的滚动变化: ```java public class CustomScrollView extends ScrollView { public CustomScrollView(Context context) { super(context); } ...

    ScrollView,嵌套ListView,ListView并同时嵌套GridView

    当ScrollView和ListView/GridView都尝试处理用户的滑动事件时,可能会导致滚动不顺畅或者无法正常滚动。为了解决这个问题,有以下几种策略: 1. 使用NestedScrollView替代ScrollView。NestedScrollView是Android ...

    Android scrollview嵌套listview

    5. 分离滚动事件:有时,你可能希望在ScrollView和ListView之间进行明确的划分,例如,当ScrollView内容滚动到底部时,才开始滚动ListView。这时,可以监听ScrollView的滚动事件,根据滚动位置动态调整ListView的...

    ListView GridView和ScrollView下拉刷新 上拉加载更多

    而LoadMoreListView则是在ListView底部添加一个加载指示器,当用户滑动到列表底部时,自动加载更多数据。 接着,GridView是二维列表视图,适用于显示多列元素,如图片墙。与ListView类似,它同样需要Adapter来填充...

    Android中控制和禁止ScrollView自动滑动到底部的方法

    有两种主要方法可以实现ScrollView滚动到底部: 1. **使用`scrollTo()`方法**: ```java public static void scrollToBottom(View scroll, View inner) { Handler mHandler = new Handler(); mHandler.post(new...

    scrollview与listview嵌套问题 Eclipse版

    ScrollView是一个可以包含单个直接子视图的滚动容器,而ListView则用于展示一个可滚动的项目列表。当在Eclipse环境下处理这两种组件的嵌套问题时,开发者可能会遇到一系列挑战。本文将深入探讨这些问题及其解决方案...

Global site tag (gtag.js) - Google Analytics