如何在一个布局中实现多个recyclerviews?

Tom*_*m11 3 performance android slidingpanelayout android-recyclerview

我想创建一个包含两个RecyclerViews 的窗格(比如说“ MyItems”,“ AllItems”)。我创建了垂直的LinearLayout,其中有TextView作为标题和RecyclerView。像这样:

在此处输入图片说明

 <LinearLayout ... >

    <TextView
        android:text="My Items"
        ... />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_items"
        ... />

    <TextView
        android:text="All Items"
        ... />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/all_items"
        ... />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

但是,使用这种方法,只有recyclerViews可以独立滚动,但是我需要整个布局只能滚动(因此,首先滚动到第一部分,然后滚动到第二部分)。我试图把它包起来ScrollViewNestedScrollView,但我得到的最接近的是滚动不流畅的动画效果

我的问题是,这种方法是否有效?如果是,是否有增加平滑滚动的方法NestedScrollView?还是应该使用另一种方法来实现此目的,例如创建ListView包含两个项目的布局,布局中包含TextViewRecyclerView

ListView

  • 清单项目1

    • 标题1
    • RecyclerView 1
  • 清单项目2

    • 标题2
    • RecyclerView2

从性能的角度来看,我认为这种方法不好。我对吗?我只需要为此找到最佳实践。谢谢。

Sha*_*wat 5

请不要使用嵌套滚动。由于将两个回收站的高度都设置为最大值,因此将无法达到回收站视图的目的,并将所有内容保留在内存中。而是继续进行以下两个选择:

1.如果您没有特定的背景,请使用类似于以下内容的适配器创建一个RecyclerView:

public class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    ArrayList<Integer> data = new ArrayList<>();
    private final int VIEW_TYPE_TEXTVIEW = 0;
    private final int VIEW_TYPE_ITEM_1 = 1;
    private final int VIEW_TYPE_ITEM_2 = 2;
    private final LayoutInflater inflater;
    private final ArrayList<Integer> data;

    public MyRecyclerAdapter(Context ctx, ArrayList<Integer> data){
        this.context = ctx;
        this.data = data;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public int getItemViewType(int position) {
        return data.get(position);
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if(viewType == VIEW_TYPE_TEXTVIEW){
            View view = inflater.inflate(R.layout.simple_textview, parent, false);
            return new TextViewHolder(view);
        }else if(viewType == VIEW_TYPE_ITEM_1){
            View view = inflater.inflate(R.layout.item_top_recycler, parent, false);
            return new Item1Holder(view);
        }else{
            View view = inflater.inflate(R.layout.item_bottom_recycler, parent, false);
            return new Item2Holder(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if(holder instanceof TextViewHolder){
            ((TextViewHolder) holder).textView.setText(...);
        }else if(holder instanceof Item1Holder){
            ((Item1Holder) holder).itemTextView.setText(...);
        }else if(holder instanceof Item2Holder){
            ((Item2Holder) holder).itemTextView.setText(...);
        }
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    class TextViewHolder extends RecyclerView.ViewHolder {


        TextView textView;

        public HeaderHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.tv);
        }
    }
    class Item1Holder extends RecyclerView.ViewHolder {


        TextView itemTextView;

        public HeaderHolder(View itemView) {
            super(itemView);
            itemTextView = itemView.findViewById(R.id.tv);
        }
    }
    class Item2Holder extends RecyclerView.ViewHolder {


        TextView itemTextView;

        public HeaderHolder(View itemView) {
            super(itemView);
            itemTextView = itemView.findViewById(R.id.tv);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像下面这样设置您的适配器:

ArrayList<Integer> data = new ArrayList<>();
//Adding first textview
data.add(0);
//Adding 10 elements of first RecyclerView
for(int i = 0; i<10; i++){
    data.add(1);
}
//Adding second textview
data.add(0);
//Adding 10 elements of second RecyclerView
for(int i = 0; i<10; i++){
    data.add(2);
}

adapter = new MyRecyclerAdapter(this, data);
navView.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

这样,您也可以使用RecyclerView来包含您的textview。此方法将为您提供最佳的优化。确保在getItemViewType()中为上层recyclerView,下层RecyclerView和TextView返回适当的VIEW_TYPE。

第二种方法是让一个RecyclerView包含4个项目:

  • 文字检视
  • 线性布局
  • 文字检视
  • 线性布局

然后使用项目动态填充这些LinearLayouts。这样可以确保在视线范围之外,至少有一个Linearlayout被回收。即便如此,第一种方法还是比这更好的方法。