我可以在ViewHolder中存储行特定数据吗?

时间:2015-02-28 14:03:21

标签: android expand android-recyclerview

具体来说,我有一个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展开一个视图然后滚动,则会有多个展开的视图,而不是一个。

2 个答案:

答案 0 :(得分:2)

ViewHolders被回收,因此无法保存行特定信息。你需要一个额外的数据结构。

答案 1 :(得分:0)

好的,我在此期间所做的解决方法是将所有扩展状态(isExpanded)存储在适配器的SparseArray中。

这有效,但我仍然想知道我是否可以在viewHolder中存储与行相关的元数据(扩展状态等),或者我是否必须为它创建新的数据结构。