wake-up-neo.com

Android ListView-aktuelle Bildlaufposition Y Pixel

Ich versuche zu erkennen, wann eine Listenansicht über einen bestimmten festgelegten Schwellenwert in Pixeln (bis zur Hälfte des ersten Elements) gescrollt wird. Leider liefert getScrollY () von listview immer 0 der Bildlaufposition. Gibt es eine Möglichkeit, die tatsächliche Position der Bildlaufleiste in Pixel abzurufen?

Hier ist der Code, den ich versucht habe zu verwenden, aber wie gesagt, gibt er nur 0 zurück.

getListView().setOnScrollListener(new AbsListView.OnScrollListener() {
    public void onScroll(AbsListView view, int firstVisibleItem,
                         int visibleItemCount, int totalItemCount) {
        Log.d("scroll", "scroll: " + getListView().getScrollY());
    }

    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (scrollState == 0)
        Log.d("scroll", "scrolling stopped");
    }
});
29
Juhani

Es gibt keine Vorstellung von Y-Scroll für eine ListView in Android, nur weil die Gesamthöhe des Inhalts unbekannt ist. Nur die Höhe des angezeigten Inhalts ist bekannt.

Es ist jedoch möglich, die aktuelle Position/Y-Bewegung eines sichtbaren Elements mithilfe des folgenden Hacks zu erhalten:

getListView().getChildAt(0).getTop();
51
Cyril Mottier

Vielleicht ist es für jemanden nützlich. Code der vorherigen Antworten funktioniert nicht, wenn die Liste schnell gescrollt wird. Denn in diesem Fall kann firstVisiblePosition unregelmäßig geändert werden. In meinem Code verwende ich kein Array zum Speichern von Positionen

fun setOnTouchScrollListener(lv: AbsListView, onTouchScrollListener: (isDown: Boolean, offset: Int?, isScrollWorking: Boolean) -> Unit) {

    var lastItemPosition: Int = -1
    var lastItemTop: Int? = null
    var lastItemHeight: Int? = null
    var lastScrollState: Int? = AbsListView.OnScrollListener.SCROLL_STATE_IDLE

    lv.setOnScrollListener(object : AbsListView.OnScrollListener {

        override fun onScroll(view: AbsListView, firstVisibleItem: Int, visibleItemCount: Int, totalItemCount: Int) {
            val child = lv.getChildAt(0)
            var offset: Int? = null
            var isDown: Boolean? = if (firstVisibleItem == lastItemPosition || lastItemPosition == -1) null else firstVisibleItem > lastItemPosition
            val dividerHeight = if (lv is ListView) lv.dividerHeight else 0
            val columnCount = if (lv is GridView) lv.numColumns else 1

            if (child != null) {
                if (lastItemPosition != -1) {
                    when (firstVisibleItem - lastItemPosition) {
                        0 -> {
                            isDown = if (lastItemTop == child.top) null else lastItemTop!! > child.top
                            offset = Math.abs(lastItemTop!! - child.top)
                        }
                        columnCount -> offset = lastItemHeight!! + lastItemTop!! - child.top + dividerHeight
                        -columnCount -> offset = child.height + child.top - lastItemTop!! + dividerHeight
                    }
                }

                lastItemPosition = firstVisibleItem
                lastItemHeight = child.height
                lastItemTop = child.top

                if (isDown != null && (offset == null || offset != 0)
                        && lastScrollState != AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                    onTouchScrollListener(isDown, offset, true)
                }
            }
        }

        override fun onScrollStateChanged(view: AbsListView, scrollState: Int) {
            lastScrollState = scrollState
            if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                onTouchScrollListener(true, 0, false)
                lastItemPosition = -1
                lastItemHeight = null
                lastItemTop = null
            }
        }
    })
}

Dann können wir verwenden, wenn eine Listenansicht über den Schwellenwert hinaus verschoben wird

private var lastThresholdOffset = 0
private var thresholdHeight = some value

setOnTouchScrollListener(listView) { isDown: Boolean, offset: Int?, isScrollWorking: Boolean ->
    val offset = offset ?: if (isDown) 0 else thresholdHeight
    lastThresholdOffset = if (isDown) Math.min(thresholdHeight, lastThresholdOffset + offset)
    else Math.max(0, lastThresholdOffset - offset)

    val result = lastThresholdOffset > thresholdHeight
}

isScrollWorking - kann zur Animation verwendet werden

0
Andrey Tuzov

Ein Refaktorcode von Malachiasz 'Antwort. Diese Funktion wird für die Höhe der dynamischen Zeile verwendet.

Rufen Sie onScroll Listener auf

mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if (mCardsListView.getChildCount() > 0) {
                    int scrollY = getScrollY();
                }
            }
        });

getScrollY-Funktion

private Dictionary<Integer, Integer> mListViewItemHeights = new Hashtable<Integer, Integer>(); 
private int getScrollY() {
        View child = mCardsListView.getChildAt(0); //this is the first visible row
        if (child == null) return 0;

        int scrollY = -child.getTop();

        mListViewItemHeights.put(mCardsListView.getFirstVisiblePosition(), child.getHeight());

        for (int i = 0; i < mCardsListView.getFirstVisiblePosition(); ++i) {
            Integer hei = mListViewItemHeights.get(i);

            //Manual add hei each row into scrollY
            if (hei != null)
                scrollY += hei;
        }

        return scrollY;
    }
0
Tai Le Anh

Sie können versuchen, OnTouchListener zu implementieren und dessen onTouch(View v, MotionEvent event) zu überschreiben und x und y mit event.getX() und event.getY() zu erhalten. Ich hatte gerade eine Demo für Swipe in der ListView-Zeile erstellt, in der eine Schaltfläche zum Löschen eines bestimmten Elements aus der ListView aktiviert wird. Sie können den Quellcode von meinem Github als ListItemSwipe überprüfen.

0
Lalit Poptani