Как получить последнюю позицию просмотра прокрутки, просмотр прокрутки - PullRequest
5 голосов
/ 30 сентября 2011

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

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

Ответы [ 2 ]

13 голосов
/ 15 октября 2011

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

Чтобы достичь этого, вы должны написать свой custiom scrollview.

Шаг-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 ::");
        }
    }
1 голос
/ 10 января 2013

Это также сработало для меня, но мое значение y на onScrollChanged никогда не становится выше, чем высота на моей вкладке samsung galaxy 27 ". Но это работает на вкладке галактики 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);
}
...