nestedscrollview中的RecyclerView行为问题

时间:2017-02-14 08:26:10

标签: android android-recyclerview nestedscrollview

我有一个嵌套的scrollview作为父级,2个recyclerviews作为其子级。我的问题是回收者视图一次性吸引它的孩子,而不是画卷轴。我怎么能阻止这个。我读过如果我们添加

 android:nestedScrollingEnabled="false"

属性这个问题来了。但我添加了这个属性,使滚动更流畅。下面给出的是我的xml文件。

 <android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/color_fafafa"
        android:orientation="vertical">
      <android.support.v7.widget.RecyclerView
                android:id="@+id/list"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:clipToPadding="false"
                android:nestedScrollingEnabled="false"
                android:paddingLeft="@dimen/dp_5"
                android:paddingRight="@dimen/dp_5"
                app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    </LinearLayout>
 </android.support.v4.widget.NestedScrollView>

有人能告诉我如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果您只有2个RecyclerViews作为孩子我建议删除一个并使用RecyclerViews ViewType。

使用这样的适配器:

public class ExampleAdapter extends RecyclerView.Adapter<BindableViewHolder> {

    private static final int VIEW_TYPE_CLASS_A = 0;
    private static final int VIEW_TYPE_CLASS_B = 1;

    private List<ClassA> class_a_list;
    private List<ClassB> class_b_list;

    public ExampleAdapter(List<ClassA> class_a_list, List<ClassB> class_b_list) {
        this.class_a_list = class_a_list;
        this.class_b_list = class_b_list;
    }

    @Override
    public BindableViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;
        switch (viewType) {
            case VIEW_TYPE_CLASS_A:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_class_a, parent, false);
                return new ClassAHolder(view);
            default:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_class_b, parent, false);
                return new ClassBHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(BindableViewHolder holder, int position) {
        if(position < class_a_list.size()) {
            ((ClassAHolder) holder).bind(class_a_list.get(position));
        } else {
            ((ClassBHolder) holder).bind(class_b_list.get(position - class_a_list.size()));
        }
    }

    @Override
    public int getItemCount() {
        return class_a_list.size() + class_b_list.size();
    }

    @Override
    public int getItemViewType(int position) {
        if(position < class_a_list.size()) {
            return VIEW_TYPE_CLASS_A;
        } else {
            return VIEW_TYPE_CLASS_B;
        }
    }
}

在getItemViewType(int position)的帮助下,您可以确定在特定位置应该有哪种View。

然后你可以像这样使用ViewHolders:

public abstract class BindableViewHolder<T> extends RecyclerView.ViewHolder {

    public BindableViewHolder(View itemView) {
        super(itemView);
    }

    public abstract void bind(T data);
}

public class ClassAHolder extends BindableViewHolder<ClassA> {

    public ClassAHolder(View itemView) {
        super(itemView);
    }

    @Override
    public void bind(ClassA data) {
        // populate your views
    }
}


public class ClassBHolder extends BindableViewHolder<ClassB> {

    public ClassBHolder(View itemView) {
        super(itemView);
    }

    @Override
    public void bind(ClassB data) {
        // populate your views
    }
}