Как получить последнюю позицию просмотра прокрутки, scrollview

Я использую TableLayout. который имеет 100 элементов, чтобы сделать его прокручиваемым. Я использую Tablelayout внутри ScrollView. Но я должен определить, прокрутил ли пользователь последнюю строку. Если пользователь прокрутил до последнего представления, ему будет показано всплывающее сообщение. Но как узнать, что пользователь прокрутил до последней строки tablelayout. Я сослался на код из TableLayout внутри ScrollView.

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


person bapi    schedule 30.09.2011    source источник


Ответы (2)


Если новая прокручиваемая позиция y + высота прокрутки >= высота таблицы, это означает, что вы достигли конца списка.

Для этого вам нужно написать свой пользовательский вид прокрутки.

Шаг 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);
        }
    }

}

Шаг 2. Создайте прослушиватель для обнаружения изменений в прокрутке.

пакет com.sunil; импортировать LDObservableScrollView;

public interface LDObservableScrollViewListener {

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

}

Шаг 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 ::");
        }
    }
person Sunil Kumar Sahoo    schedule 15.10.2011

Это также сработало для меня, но мое значение y на onScrollChanged никогда не становится выше, чем высота на моей вкладке галактики Samsung 2 7 ". Но это работает на вкладке галактики 2 10,1". Есть идеи, почему?

[Изменить] Теперь я видел, что это происходит, когда экран меньше определенной высоты, например, 1000 пикселей. Потому что, когда я сделал содержимое своей прокрутки менее 1200 на 10,1-дюймовой вкладке Galaxy 2, он перестал работать для определения максимальной высоты.

[Изменить] Я нашел решение, оно неправильно определяло размер прокрутки, для этого я сделал следующее:

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);
}
person Edison Santos    schedule 10.01.2013