我有一个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
,或者我可能已经在某种程度上这样做了?!就像我说的那样,这对我来说都是全新的,我在这里潜入深渊。
我希望有人能帮助我。
答案 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;
}
}
});