【发布时间】:2019-04-05 20:59:50
【问题描述】:
我有一个 RecyclerView 在我的应用程序中使用 FirestoreRecyclerAdapter。 ViewHolders 实现了一个可扩展的“快速操作”菜单,可在点击项目时展开,理想的行为是一次只展开一个项目。展开一项应折叠适配器中的所有其他项。
当屏幕上的项目足够少时,这可以正常工作。但是,如果列表在屏幕外扩展,当我尝试遍历适配器的项目时,当分离或屏幕外的 ViewHolders 尝试调用 getParent() 时,我会得到 NullPointerException。
如何遍历适配器中的所有 ViewHolders,或者仅遍历可见的 ViewHolders?
相关适配器代码:
@Override
protected void onBindViewHolder(@NonNull BrewViewHolder holder,
int position, @NonNull Brew brew) {
// Bind Views
holder.bind(brew);
// Set expander ClickListener
holder.card.setOnClickListener(v -> {
for (int i = 0; i < mAdapter.getItemCount(); i++) {
if (i != position) {
// ERROR THROWN HERE
BrewViewHolder vh = ((BrewViewHolder) recyclerView.getChildViewHolder(recyclerView.getChildAt(i)));
vh.expanded = false;
}
}
holder.expanded = !holder.expanded;
notifyItemChanged(position);
});
}
相关ViewHolder代码:
public class BrewViewHolder extends RecyclerView.ViewHolder {
// Expanded state
public boolean expanded = false;
...
public BrewViewHolder(@NonNull final View itemView) {
super(itemView);
...
// Set visibility of quick actions based on expanded state
quickActions.setVisibility(expanded ? View.VISIBLE : View.GONE);
}
}
提前致谢!
编辑:正如Gilberto 指出的那样,这非常昂贵。使用Andrew的解决方案版本:
private int expandedItemIndex = -1;
@Override
protected void onBindViewHolder(@NonNull BrewViewHolder holder, int position,
@NonNull Brew brew) {
// Bind Views
holder.bind(brew);
// Set expander ClickListener
holder.card.setOnClickListener(v -> {
if (position == expandedItemIndex) {
holder.expanded = false;
expandedItemIndex = -1;
} else {
holder.expanded = true;
if (expandedItemIndex != -1) {
BrewViewHolder otherHolder = ((BrewViewHolder) recyclerView.getChildViewHolder(
recyclerView.getChildAt(expandedItemIndex)));
otherHolder.expanded = false;
}
expandedItemIndex = position;
}
notifyItemRangeChanged(0, recyclerView.getChildCount());
});
}
【问题讨论】:
-
最简单的方法是使用
lisawray/Groupie的ExpandableGroups。 -
希望在没有外部库的情况下做到这一点。他们的实现是否有简化?
标签: android android-recyclerview android-viewholder