5

我想创建一个窗格,其中有两个RecyclerViews(比如说“MyItems”、“AllItems”)。我创建了 vertical LinearLayout,其中有TextViewtitle 和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>

然而,使用这种方法,只有 recyclerViews 可以独立滚动,但我需要整个布局只能滚动(所以首先它滚动通过第一部分,然后是第二部分)。我试图把它包起来ScrollViewNestedScrollView但我得到的最接近的是没有平滑动画的滚动。

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

ListView

  • 清单项目 1

    • 标题 1
    • 回收站查看 1
  • 清单项目 2

    • 标题 2
    • 回收站View2

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

4

4 回答 4

6

请不要使用嵌套滚动。它将破坏回收器视图的目的,并将所有内容保留在内存中,因为两个回收器的高度都将设置为最大值。而是继续以下两个选择:

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

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

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

这样,您也可以使用 RecyclerView 来包含您的 textview。这种方法会给你最好的优化。确保在 getItemViewType() 中为上层 recyclerView、下层 RecyclerView 和 TextViews 返回适当的 VIEW_TYPE。

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

  • 文本视图
  • 线性布局
  • 文本视图
  • 线性布局

然后用项目动态填充这些线性布局。这将确保至少有一个 Linearlayout 在看不见时被回收。即便如此,第一种方法也将是比这更好的方法。

于 2018-06-05T18:24:18.413 回答
1

首先,除非有充分的理由,否则在一个屏幕上显示两个回收站视图并不是一个好主意。尝试在一个回收器视图中使用带有标题的不同部分。

如果还想用,把布局嵌入进去NestedScrollView,把recyclerView的nestedScrollingEnabled属性设置为false

recyclerView.setNestedScrollingEnabled(false);

提示:查看FastAdapter,它可以让工作更轻松。

于 2018-06-05T18:01:33.370 回答
1

无论您想要实现什么,都最好按照以下链接所示完成:http: //khmertechtrain.tk/index.php/2017/10/03/create-a-vertical-scroll-and-horizo​​ntal -scroll-app-像谷歌游戏商店/

此外,如果所有视图都相似,您将需要使用 RecycledViewPool 以便在多个 RecyclerViews 之间共享视图。

于 2018-10-31T13:58:54.323 回答
0

您应该尝试您所说的最接近您想要的 NestedScrollView 解决方案:

NestedScrollView
   TextView
   RecyclerView
   TextView
   RecyclerView

为了平滑滚动,您需要在回收站视图中设置一个属性:

 recyclerView.setNestedScrollingEnabled(false);

这样,您的布局将滚动 NestedScrollView 而不是 RV。

于 2018-06-05T17:58:16.570 回答