在recyclerview

时间:2018-06-07 09:02:59

标签: android android-recyclerview

我使用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滚动非常缓慢。

3 个答案:

答案 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知道你是否遇到任何问题,并且总是记得发布你的日志。