RecyclerView расширяющий элемент с ConstraintSet - расширяет неправильный элемент / строку - PullRequest
0 голосов
/ 09 мая 2018

У меня есть RecyclerView и я хочу расширить строки с помощью ConstraintSet's.
Часть RecyclerView работает, и общая идея расширения / свертывания с помощью ConstraintSet также работает, но она расширяет неправильную строку.
Если я нажимаю на первую запись, она расширяет некоторый элемент, например, на 10 строк ниже.

Поскольку я новичок в использовании RecyclerView и ConstraintSet, я немного растерялся из-за того, как его решить.
Код моего адаптера выглядит так:

public class ProgressAdapter extends RecyclerView.Adapter<ProgressAdapter.MyViewHolder> {

    private List<ProgressData> progressData;

    private ConstraintSet collapsedConstraintSet = new ConstraintSet();
    private ConstraintSet expandedConstraintSet = new ConstraintSet();
    private ConstraintLayout mainLayout;
    private boolean expanded = false;

    public class MyViewHolder extends RecyclerView.ViewHolder {

        public TextView t1;
        ...

        public MyViewHolder(View itemView) {
            super(itemView);

            t1 = (TextView) itemView.findViewById(R.id.t1text);
            ...

        }
    }

    public ProgressAdapter(List<ProgressData> progressData) {
        this.progressData = progressData;
    }

    @NonNull
    @Override
    public ProgressAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View progressView = LayoutInflater.from(parent.getContext()).inflate(R.layout.progress_item, parent, false);
        mainLayout = (ConstraintLayout) progressView;

        collapsedConstraintSet.clone(mainLayout);
        expandedConstraintSet.clone(mainLayout.getContext(), R.layout.progress_item_expanded);

        mainLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TransitionManager.beginDelayedTransition(mainLayout);
                if (expanded) {
                    collapsedConstraintSet.applyTo(mainLayout);
                    expanded = false;
                } else {
                    expandedConstraintSet.applyTo(mainLayout);
                    expanded = true;
                }
            }
        });

        return new MyViewHolder(progressView);
    }

    @Override
    public void onBindViewHolder(@NonNull ProgressAdapter.MyViewHolder holder, final int position) {

        ProgressData progress = progressData.get(position);
        holder.t1.setText(progress.getNumber());
        ...

    }

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

}  

Результат не меняется, независимо от того, куда я поместил ClickListener (где он сейчас, или в ViewHolder, или в onBind).
Когда я регистрирую mainLayout.getId(), это всегда -1, может быть, это часть проблемы?
Я просто не понимаю, как передать Id или что-то еще из строки, по которой щелкнули, моему applyTo, или, может быть, я уже каким-то образом это делаю ?! Как я уже сказал, для меня все это ново, и я нырнул прямо в глубокий конец здесь.

Я надеюсь, что кто-то может помочь мне с этим.

1 Ответ

0 голосов
/ 09 мая 2018

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

Я думаю, что быстрое решение этой проблемы - изменить слушателя щелчка следующим образом, чтобы применить ConstraintSet к просмотру по щелчку:

mainLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            TransitionManager.beginDelayedTransition(mainLayout);
            if (expanded) {
                collapsedConstraintSet.applyTo((ConstraintLayout) view);
                expanded = false;
            } else {
                expandedConstraintSet.applyTo((ConstraintLayout) view);
                expanded = true;
            }
        }
    });
...