Domanda ScrollingViewBehavior per ListView


Ho due attività che uso AppBarLayout con un Toolbar e TabLayout dalla libreria di supporto 22.

Il layout di entrambi è abbastanza simile: A Toolbar in alto, sotto di esso TabLayout, sotto di esso a ViewPager contenente 3 FragmentS.

La prima attività Fragment ha un RecyclerView, la seconda attività Fragment sta usando a ListView anziché.

Lo scorrevole Toolbar esempio da https://github.com/chrisbanes/cheesesquare sta lavorando bene sulla prima attività usando il RecyclerView, ma con il ListView.

Ho provato a creare un'abitudine ListViewScrollBehavior quello si estende AppBarLayout.ScrollingViewBehavior, ma finora nessuna fortuna. Il TouchEvents vengono passati alla classe personalizzata solo per lo scorrimento orizzontale, ma non quando lo si scorre ListView (verticalmente).

Qualsiasi modo di usare a CoordinatorLayout con ListView?


33
2018-06-03 06:30


origine


risposte:


L'unica soluzione per farlo funzionare ora è usare questo:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
     listView.setNestedScrollingEnabled(true);
}

Ovviamente funzionerà solo su Lollipop.


36
2018-06-06 07:31



Soluzione alternativa a La risposta di Nicolas POMEPUY è da usare ViewCompat.setNestedScrollingEnabled(View, boolean)

ViewCompat.setNestedScrollingEnabled(listView, true);

Ovviamente il comportamento di scrolling annidato funziona solo da Lollipop.


13
2017-09-15 03:15



Credo che il CoordinatorLayout funziona solo con RecyclerView e NestedScrollView. Prova a avvolgere il tuo ListView in un NestedScrollView o convertirlo in a RecyclerView con un LinearLayoutManager


11
2018-06-03 07:08



Per una vista in grado di reagire su AppBarLayout, è necessario implementare NestedScrollingChild. ListView no. Ma potrebbe essere implementato facilmente da una classe di delegati. Usalo, farà come quello che ha fatto RecyclerView

public class NestedScrollingListView extends ListView implements NestedScrollingChild {
private NestedScrollingChildHelper mNestedScrollingChildHelper;

public NestedScrollingListView(final Context context) {
    super(context);
    initHelper();
}

public NestedScrollingListView(final Context context, final AttributeSet attrs) {
    super(context, attrs);
    initHelper();
}

public NestedScrollingListView(final Context context, final AttributeSet attrs, final int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initHelper();
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public NestedScrollingListView(final Context context, final AttributeSet attrs, final int defStyleAttr, final int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    initHelper();
}

private void initHelper() {
    mNestedScrollingChildHelper = new NestedScrollingChildHelper(this);
    setNestedScrollingEnabled(true);
}

@Override
public void setNestedScrollingEnabled(final boolean enabled) {
    mNestedScrollingChildHelper.setNestedScrollingEnabled(enabled);
}

@Override
public boolean isNestedScrollingEnabled() {
    return mNestedScrollingChildHelper.isNestedScrollingEnabled();
}

@Override
public boolean startNestedScroll(final int axes) {
    return mNestedScrollingChildHelper.startNestedScroll(axes);
}

@Override
public void stopNestedScroll() {
    mNestedScrollingChildHelper.stopNestedScroll();
}

@Override
public boolean hasNestedScrollingParent() {
    return mNestedScrollingChildHelper.hasNestedScrollingParent();
}

@Override
public boolean dispatchNestedScroll(final int dxConsumed, final int dyConsumed, final int dxUnconsumed, final int dyUnconsumed, final int[] offsetInWindow) {
    return mNestedScrollingChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow);
}

@Override
public boolean dispatchNestedPreScroll(final int dx, final int dy, final int[] consumed, final int[] offsetInWindow) {
    return mNestedScrollingChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
}

@Override
public boolean dispatchNestedFling(final float velocityX, final float velocityY, final boolean consumed) {
    return mNestedScrollingChildHelper.dispatchNestedFling(velocityX, velocityY, consumed);
}

@Override
public boolean dispatchNestedPreFling(final float velocityX, final float velocityY) {
    return mNestedScrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY);
}

}


5
2018-04-13 06:56



ListView ScrollingViewBehavior supporta solo> = 21.

Altrimenti dovresti scrivere il codice come di seguito:

private int mPreviousVisibleItem;


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    listView.setNestedScrollingEnabled(true);
} else {
    listView.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 (firstVisibleItem > mPreviousVisibleItem) {
                appBarLayout.setExpanded(false, true);
            } else if (firstVisibleItem < mPreviousVisibleItem) {
                appBarLayout.setExpanded(true, true);
            }
            mPreviousVisibleItem = firstVisibleItem;
        }
    });
}

1
2017-12-08 13:27