【发布时间】:2015-03-12 09:37:52
【问题描述】:
如果我有 50 种视图怎么办?我的适配器中应该有 50 个静态内部类吗? 根据this answer,是的。
我的第一个想法是将每个视图内部类移动到一个单独的公共类中,但它们必须是静态的。那么把每一个都封装成一个公共类,让内部类变成静态的?还有更好的选择吗?
编辑: 代码示例: 所以这将是一个很好的解决方案?这不是也影响性能吗?
public class MainViewHolder extends DragSortAdapter.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
View container;
TextView title;
//called in onCreateViewHolder in adapter
public MainViewHolder(DragSortAdapter adapter, View itemView) {
super(adapter, itemView);
container = itemView.findViewById(R.id.card_root);
title = container.findViewById(R.id.text);
}
//called by onBindViewHolder in adapter
public void setData(Data data) {
title.setText(data.title);
}
}
编辑2: 示例,用于当返回 viewholder 的新实例时
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case 0: return new MainViewHolder(...);
case 2: return new MainViewHolderOther(...);
...
}
}
【问题讨论】:
-
为什么你认为顶级类不是静态的?您能否添加一些代码示例来阐明您的意思?
-
为什么它们必须是静态的?
-
@NiekHaarman 顶级公共类在 java 中不能是静态的。
-
@Tamas 根据定义,顶级类是静态的。并且 ViewHolder 模式“要求”它,因此 ViewHolder 实例没有对其外部类的引用。使静态内部 ViewHolder 类成为顶级类具有完全相同的结果。
-
如果你有 20 种类型,每种 1 项,
ViewHolder模式无效。ViewHolder模式仅在相同的View可用于ListView中的多个项目时才有用。这就提出了一个问题,你是否真的需要这 20 种类型。例如,不同的背景颜色不需要是不同的类型。
标签: android adapter android-recyclerview