Пожалуйста, не используйте вложенную прокрутку.Это отрицательно скажется на назначении рециркулятора и сохранит все в памяти, так как высота будет установлена на максимум для обоих утилизаторов.Вместо этого выполните следующие два варианта:
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 будет переработан вне поля зрения.Даже тогда первый подход будет гораздо лучше, чем этот.