ListView

时间:2015-06-03 06:30:31

标签: android android-listview android-support-library android-recyclerview

我使用AppBarLayout和支持库22中的ToolbarTabLayout进行了两项活动。

两者的布局非常相似:顶部Toolbar位于其下方TabLayout,低于ViewPager,包含3 Fragment s。

第一个活动的Fragment有一个RecyclerView, 第二个活动Fragment正在使用ListView

来自https://github.com/chrisbanes/cheesesquare的可滚动Toolbar示例在使用RecyclerView的第一项活动中正常运行,但在ListView上启用。

我尝试创建了一个扩展ListViewScrollBehavior的自定义AppBarLayout.ScrollingViewBehavior,但到目前为止还没有运气。 TouchEvent仅传递给自定义类以进行水平滚动,但在滚动ListView(垂直)时则不会传递。

CoordinatorLayoutListView一起使用的任何方式?

6 个答案:

答案 0 :(得分:36)

现在唯一能让它发挥作用的解决方案就是使用它:

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

它显然只适用于棒棒糖。

答案 1 :(得分:13)

Nicolas POMEPUY's answer的替代解决方案是使用ViewCompat.setNestedScrollingEnabled(View, boolean)

var contentUrlPassedOn: String!

    override func viewDidLoad() {
        super.viewDidLoad()

        myWebView.delegate = self

        let url: NSURL! = NSURL(string: contentUrlPassedOn)

        myWebView.loadRequest(NSURLRequest(URL: url))
        var request: NSURLRequest
}

当然,嵌套滚动行为只适用于Lollipop。

答案 2 :(得分:11)

我认为CoordinatorLayout仅适用于RecyclerViewNestedScrollView。尝试将ListView包裹在NestedScrollView中,或将其转换为RecyclerView LinearLayoutManager

答案 3 :(得分:5)

对于能够对AppBarLayout做出反应的视图,它需要实现NestedScrollingChild。 ListView不是。但它可以很容易地由代表类实现。使用它,它会像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);
}

}

答案 4 :(得分:1)

ListView ScrollingViewBehavior仅支持> = 21。

否则你应该按照以下方式编写代码:

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;
        }
    });
}

答案 5 :(得分:0)

您可以添加

    android:nestedScrollingEnabled="true"
从XML到ListView,请注意,它仅支持API 21+。另外,您可以将ListView换成RecyclerView,这样会更好。