我使用recyclerview来显示数据。我想要一个布局顶部的按钮,以便用户可以过滤数据。我希望用户在recyclelerview按钮上滚动时应该滚动。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/djPhotos"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="satlaa.mysql_test.DJPhotos">
<Button
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="Text" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recylcerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
现在按钮贴在布局的顶部。
我尝试了scrollview,但它使recyclelerview滚动非常缓慢。
答案 0 :(得分:2)
你应该尝试如下协调器布局
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<android.support.design.widget.AppBarLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/transparent"
app:elevation="@dimen/dp_0"
>
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_collapseMode="parallax"
>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:overScrollMode="never"
android:scrollbars="none"
android:splitMotionEvents="false"
app:layoutManager="LinearLayoutManager"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:offset="@{@dimen/dp_0}"
/>
</android.support.design.widget.CoordinatorLayout>
答案 1 :(得分:1)
您可以尝试以下代码: -
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0 && mButton.getVisibility() == View.VISIBLE) {
mButton.hide();
} else if (dy < 0 && mButton.getVisibility() != View.VISIBLE) {
mButton.show();
}
}
});
答案 2 :(得分:0)
创建两个布局。一个用于其他视图,一个用于按钮。然后在你的适配器中声明两个全局变量int。
private static final int TYPE_BUTTON = 0;
private static final int TYPE_ITEM = 1;
在onCreateViewHolder
内查看要返回的相应布局。
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_ITEM) {
//inflate other items layout and pass it to view holder.
//replace the null with your instance
return new ItemViewHolder(null);
} else if (viewType == TYPE_BUTTON) {
//inflate button items layout and pass it to view holder.
//replace the null with your view instance
return new ButtonViewHolder(null);
}
}
创建两个视图。一个用于按钮,另一个用于其他列表。例如:
ButtonViewHolder
public class ButtonViewHolder extends RecyclerView.ViewHolder{
...
}
ItemViewHolder
public class ItemViewHolder extends RecyclerView.ViewHolder{
...
}
在getViewType()
中,在第一个位置返回按钮,否则返回其他项目。该函数应如下所示:
@Override
public int getItemViewType(int position) {
if (position ==0)
return TYPE_BUTTON;
return TYPE_ITEM;
}
将1添加到项目的长度并将其返回到适配器的getItemCount()
中。
@Override
public int getItemCount() {
return data.length + 1;
}
在绑定到您的查看者之前检查。像这样:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ItemViewHolder) {
//Minus onString dataItem = getItem(position-1);
//cast holder to ItemViewHolder and set data
} else if (holder instanceof ButtonViewHolder) {
//cast holder to ButtonViewHolder and set data for header.
}
}
注意:减去1
来自您尝试在onBindViewHolder
方法中填充的每个数据,其中holder是ItemViewHolder
的实例。
Lemme知道你是否遇到任何问题,并且总是记得发布你的日志。