Как реализовать несколько просмотров переработчика в одном макете? - PullRequest
0 голосов
/ 05 июня 2018

Я хочу создать панель, в которой есть два RecyclerView (скажем, «MyItems», «AllItems»).Я создал вертикальную LinearLayout, в которой заголовок TextView и RecyclerView.Примерно так:

enter image description here

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

Однако, при таком подходе, только просмотрщик-просмотрщик может прокручиваться независимо, но мне нужно, чтобы весь макет был прокручиваемым только (так что сначала он просматривает первый раздел, затем второй).Я попытался обернуть это в ScrollView и NestedScrollView, но самым близким, что я получил, была прокрутка без плавной анимации .

Мой вопрос, является ли этот подход верным, и если да, тоЕсть ли способ добавить плавную прокрутку в NestedScrollView?Или я должен реализовать это, используя другой подход, например, создать ListView, который содержит два элемента с макетом, содержащим TextView и RecyclerView?

ListView

  • Элемент списка 1

    • Заголовок 1
    • RecyclerView 1
  • Элемент списка 2

    • Заголовок 2
    • RecyclerView2

Я считаю, что такой подход нехорошо с точки зрения производительности.Я прав?Мне просто нужно найти лучшую практику для этого.Спасибо.

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

Все, что вы пытаетесь достичь, лучше сделать, как показано в ссылке ниже: http://khmertechtrain.tk/index.php/2017/10/03/create-a-vertical-scroll-and-horizontal-scroll-app-like-google-play-store/

Кроме того, вам нужно будет использовать RecycledViewPool для обмена представлениями между несколькими RecyclerViews, если вообщевзгляды будут похожи.

0 голосов
/ 05 июня 2018

Прежде всего, не стоит иметь два представления переработчика на одном экране, если для этого нет веских причин.Попробуйте использовать разные разделы с заголовками в одном представлении переработчика.

Если вы все еще хотите использовать его, вставьте макет в NestedScrollView и установите для свойства nestedScrollingEnabled recyclerView значение false

recyclerView.setNestedScrollingEnabled(false);

Совет. Проверьте FastAdapter , который облегчает работу.

0 голосов
/ 05 июня 2018

Пожалуйста, не используйте вложенную прокрутку.Это отрицательно скажется на назначении рециркулятора и сохранит все в памяти, так как высота будет установлена ​​на максимум для обоих утилизаторов.Вместо этого выполните следующие два варианта:

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, чтобы также содержать ваше текстовое представление.Этот метод даст вам лучшую оптимизацию.Убедитесь, что вы возвращаете соответствующий VIEW_TYPE в getItemViewType () для своего верхнего recyclerView, нижнего RecyclerView и TextViews.

Второй метод состоит в том, чтобы один RecyclerView содержал 4 элемента:

  • TextView
  • LinearLayout
  • TextView
  • LinearLayout

Затем динамически заполняйте эти LinearLayout элементами.Это гарантирует, что по крайней мере один из Linearlayout будет переработан вне поля зрения.Даже тогда первый подход будет гораздо лучше, чем этот.

0 голосов
/ 05 июня 2018

Вам следует попробовать решение NestedScrollView, которое, как вы сказали, было наиболее близким к тому, что вы хотели:

NestedScrollView
   TextView
   RecyclerView
   TextView
   RecyclerView

И чтобы иметь плавную прокрутку, необходимо установить свойство в представлениях вашего рециркулятора:

 recyclerView.setNestedScrollingEnabled(false);

Таким образом, ваш макет будет прокручивать NestedScrollView, а не RV.

...