RecyclerView 使用 ConstraintSet 扩展项目 - 扩展错误 item/row
RecyclerView expanding item with ConstraintSet - expands wrong item/row
我有一个 RecyclerView,想用 ConstraintSet 扩展行。
RecyclerView 部分有效,expanding/collapsing 与 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
,或者我可能已经在以某种方式这样做了?!就像我说的,这对我来说是全新的,我直接进入了这里的深处。
我希望有人能帮助我。
您正在使用 class 成员变量 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;
}
}
});
我有一个 RecyclerView,想用 ConstraintSet 扩展行。
RecyclerView 部分有效,expanding/collapsing 与 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
,或者我可能已经在以某种方式这样做了?!就像我说的,这对我来说是全新的,我直接进入了这里的深处。
我希望有人能帮助我。
您正在使用 class 成员变量 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;
}
}
});