Задать вопрос
@Imustrunaway
Углубляюсь в хитросплетение IT

ConstraintLayout in LinearLayout in RecyclerView. Group. Почему так?

Все нижеизложенное проходит в рамках пет-проекта, ни один пользователь не пострадал.

item в RecyclerView является LinearLayout c двумя одинаковыми вложенными (include) ConstraintLayout с большим количеством view (назовем их sub_item1 и sub_item2).
В попытке обойтись без ExpandableLayout я воспользовался Group и настройками видимости.
Проблема в том, что меняя видимость Group в sub_item1 "дергается" и sub_item2
(см. гифку). К слову, если менять видимость sub_item2 - sub_item1 не двигается.
5e296ff8c6b47336753550.gif

Решив что проблема в одинаковом id Group в рамках одного item, было решено слить оба sub_item в один и обозначить у каждой group свой id.
Но проблема осталась.
В чем может быть причина?

Код здесь

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_2);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        lInf = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
        
        //RecyclerView
        hSV = findViewById(R.id.hSV);

        DataAdapter adapter = new DataAdapter(this);
        hSV.setAdapter(adapter);
    }

    class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {

        private LayoutInflater layInf2;
        private Context mCont;

        DataAdapter(Context context) {
            this.layInf2 = LayoutInflater.from(context);
            mCont = context;
        }

        @NonNull
        @Override
        public DataAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View v = layInf2.inflate(R.layout.item_main, parent,false);
            return new ViewHolder(v);
        }

        @Override
        public void onBindViewHolder(@NonNull DataAdapter.ViewHolder holder, int position) {
            holder.onBind(holder.ivArr);
        }

        @Override
        public int getItemCount() {
            return 12;
        }

        public class ViewHolder extends RecyclerView.ViewHolder {
            private ImageView ivArr;
            private Group gr1;
            private boolean isExpand;

            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                //До слияния sub_item1 и sub_item2 в один
                ivArr = itemView.findViewById(R.id.sub_item1).findViewById(R.id.IV_arrow);

                gr1 = itemView.findViewById(R.id.sub_item1).findViewById(R.id.group1);

                isExpand = gr1.getVisibility() == View.VISIBLE;
            }

            public void onBind (ImageView iv) {
                iv.setOnClickListener(v -> {
                    if(isExpand) {
                        gr1.setVisibility(View.GONE);
                    } else {
                        gr1.setVisibility(View.VISIBLE);
                    }
                    isExpand = !isExpand;
                });
            }
        }
    }

  • Вопрос задан
  • 36 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@WaterSmith
Android-разработчик. Java, Kotlin
Тут не код, тут разметку надо смотреть. у вас положение второго айтема зависит от положения первого, когда вы сворачиваете первый айтем, он становится уже и у него правый край смещается влево, а второй айтем за ним подтягивается. Если вы хотели чтобы было иначе, то нужно делать так, чтобы размеры айтемов были фиксированными.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы