RecyclerView使用ConstraintSet扩展项目 - 扩展错误的项目/行

时间:2018-05-09 06:43:46

标签: android android-recyclerview android-adapter android-constraintlayout

我有一个RecyclerView,想要使用ConstraintSet扩展行。
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 :(得分:0)

您正在使用类成员变量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;
            }
        }
    });