具体来说,我有一个RecyclerView,显示单击时可以展开的项目。我需要在某处存储视图的状态(展开/折叠),以便正确调整重用视图的大小。
我正在考虑在ViewHolder(mIsExpanded)中存储一个布尔值,但它似乎不起作用,这是我的代码:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, final int pos) {
final PetrolStation station = this.mData.get(pos);
final PetrolStationRowHolder rowHolder = (PetrolStationRowHolder) viewHolder;
rowHolder.setExpanded(rowHolder.isExpanded());
}
以下代码位于我的ViewHolder中:
public FrameLayout rowContainer; // The root layout of the row
private boolean mIsExpanded; // Stores whether this view is expanded
public void setExpanded(final boolean expanded){
if(mExpandedLayoutHeight != 0 && mCollapsedLayoutHeight != 0) {
if (expanded) {
rowContainer.getLayoutParams().height = mExpandedLayoutHeight;
mIsExpanded = true;
} else {
rowContainer.getLayoutParams().height = mCollapsedLayoutHeight;
mIsExpanded = false;
}
rowContainer.setLayoutParams(rowContainer.getLayoutParams());
}
}
private boolean isExpanded() {
return mIsExpanded;
}
当我滚动时,我希望所有视图都能正确调整大小,但它们不是。如果我通过onClick展开一个视图然后滚动,则会有多个展开的视图,而不是一个。
答案 0 :(得分:2)
ViewHolders被回收,因此无法保存行特定信息。你需要一个额外的数据结构。
答案 1 :(得分:0)
好的,我在此期间所做的解决方法是将所有扩展状态(isExpanded)存储在适配器的SparseArray中。
这有效,但我仍然想知道我是否可以在viewHolder中存储与行相关的元数据(扩展状态等),或者我是否必须为它创建新的数据结构。