【问题标题】:How to get last scroll view position, scrollview如何获取最后一个滚动视图位置,滚动视图
【发布时间】:2013-01-11 18:34:43
【问题描述】:

我正在使用 TableLayout。其中有 100 个项目使其可滚动我在 ScrollView 中使用 Tablelayout。但我必须检测用户是否滚动到最后一行。如果用户已滚动到最后一个视图,则将向用户显示 Toast 消息。 但是如何知道用户已经滚动到表格布局的最后一行。我已经参考了TableLayout inside ScrollView 的代码。

http://huuah.com/using-tablelayout-on-android/

【问题讨论】:

  • 你为什么不使用ListViewlv.setOnScrollListener()或者看看this SO answer
  • 我不能使用列表视图,因为。该项目已经开发完成。它对不同的地方有影响
  • 尝试查看 onOverScrolled 方法..

标签: android scrollview tablelayout


【解决方案1】:

如果新的滚动 y 位置 + 滚动视图高度 >= 表视图高度,则表示您已到达列表末尾。

要实现这一点,您必须编写自定义滚动视图。

Step-1您必须创建自定义滚动视图扩展 ScrollView

package com.sunil;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;

public class LDObservableScrollView extends ScrollView {

    private LDObservableScrollViewListener scrollViewListener = null;

    public LDObservableScrollView(Context context) {
        super(context);
    }

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

    public LDObservableScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setScrollViewListener(LDObservableScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }

    @Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy) {
        super.onScrollChanged(x, y, oldx, oldy);
        if(scrollViewListener != null) {
            scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
        }
    }

}

Step-2创建一个监听器来检测滚动变化

包 com.sunil; 导入 LDObservableScrollView;

public interface LDObservableScrollViewListener {

    void onScrollChanged(LDObservableScrollView scrollView, int x, int y, int oldx, int oldy);

}

Step-3 在布局 xml 中代替 ScrollView 使用自定义滚动视图

<com.abc.LDObservableScrollView android:layout_width="fill_parent" android:layout_marginTop="1dip"
        android:id="@+id/OLF_ScrollView" android:layout_height="fill_parent" android:background="@drawable/small_list_back">
        <TableLayout android:layout_width="fill_parent" android:id="@+id/OLF_tableLayout_TableLayout" android:layout_height="fill_parent">
        </TableLayout>
    </com.abc.LDObservableScrollView>

第 4 步在您的活动类或您要检测滚动事件的地方使用以下代码

public class DetectHere implements LDObservableScrollViewListener{
...


LDObservableScrollView scrollView = (LDObservableScrollView)view.findViewById(R.id.OLF_ScrollView);
         scrollView.setScrollViewListener(this);

.....

@Override
    public void onScrollChanged(LDObservableScrollView scrollView, int x,
            int y, int oldx, int oldy) {
        // TODO Auto-generated method stub
        if((scrollView.getHeight()+y) >= tableLayout.getHeight()){
            Log.e("Custom Listener ", "END OF LIST OCCURRED ::");
        }
    }

【讨论】:

    【解决方案2】:

    这也对我有用,但我在 onScrollChanged 上的 y 值永远不会高于我的三星 Galaxy Tab 2 7" 上的高度。 但它适用于 Galaxy Tab 2 10.1" 任何想法为什么?

    [编辑] 我现在已经看到,当屏幕小于某个高度(例如 1000 像素)时会发生这种情况。因为当我在 10.1" Galaxy tab 2 上将滚动的内容设置为小于 1200 时,它停止了最大高度检测。

    [编辑] 我找到了解决方案,它没有正确检测滚动的大小,为了做到这一点,我所做的如下:

    protected void onScrollChanged(int horizontalScrollPosition, int verticalScrollPosition, int previousHorizontalScrollPosition, int previousVerticalScrollPosition) {
        int scrollTotalHeight = this.getChildAt(0).getHeight() - super.getHeight();
        if(_previousImage != null)
            if(verticalScrollPosition <= 0) _previousImage.setVisibility(View.GONE);
        if(_nextImage != null)
            if(verticalScrollPosition >= scrollTotalHeight) _nextImage.setVisibility(View.GONE);
        super.onScrollChanged(horizontalScrollPosition, verticalScrollPosition, previousHorizontalScrollPosition, previousVerticalScrollPosition);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多