Android 抽象 类 糟糕的魔法空指针
Android abstract classes bad magic nullpointer
我为 RecycledView
编写了适配器,它使用 2 种类型的项目。因此 ViewHolder
有三个 classes:Base class 和 2 个它的实现。
public abstract class AbstractCatalogItemViewHolder extends RecyclerView.ViewHolder {
public WebImageView icon;
...
public AbstractCatalogItemViewHolder(View itemView) {
super(itemView);
}
}
public class CategoryViewHolder extends AbstractCatalogItemViewHolder {
public CategoryViewHolder(View itemView) {
super(itemView);
icon = (WebImageView) itemView.findViewById(R.id.icon);
...
}
}
问题是第二个图标指向对象 (WebImageView
),但第一个是 null
。怎么可能?
@Override
public void onBindViewHolder(AbstractCatalogItemViewHolder abstractViewHolder,
final int position) {
int type = getItemViewType(position);
WebImageView icon = abstractViewHolder.icon;
WebImageView icon2 = ((CategoryViewHolder) abstractViewHolder).icon;
...
}
onCreateViewHolder:
@Override
public AbstractCatalogItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
int type = getItemViewType(i);
View v = inflater.inflate(
type == TYPE_CATEGORY ?
R.layout.item_category :
R.layout.item_product,
viewGroup, false);
return type == TYPE_CATEGORY ? new CategoryViewHolder(v) : new ProductViewHolder(v);
}
传入 onCreateViewHolder
的 int 已经是 itemType,删除对 onCreateViewHolder
内部的 getItemViewType
的调用。
我为 RecycledView
编写了适配器,它使用 2 种类型的项目。因此 ViewHolder
有三个 classes:Base class 和 2 个它的实现。
public abstract class AbstractCatalogItemViewHolder extends RecyclerView.ViewHolder {
public WebImageView icon;
...
public AbstractCatalogItemViewHolder(View itemView) {
super(itemView);
}
}
public class CategoryViewHolder extends AbstractCatalogItemViewHolder {
public CategoryViewHolder(View itemView) {
super(itemView);
icon = (WebImageView) itemView.findViewById(R.id.icon);
...
}
}
问题是第二个图标指向对象 (WebImageView
),但第一个是 null
。怎么可能?
@Override
public void onBindViewHolder(AbstractCatalogItemViewHolder abstractViewHolder,
final int position) {
int type = getItemViewType(position);
WebImageView icon = abstractViewHolder.icon;
WebImageView icon2 = ((CategoryViewHolder) abstractViewHolder).icon;
...
}
onCreateViewHolder:
@Override
public AbstractCatalogItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
int type = getItemViewType(i);
View v = inflater.inflate(
type == TYPE_CATEGORY ?
R.layout.item_category :
R.layout.item_product,
viewGroup, false);
return type == TYPE_CATEGORY ? new CategoryViewHolder(v) : new ProductViewHolder(v);
}
传入 onCreateViewHolder
的 int 已经是 itemType,删除对 onCreateViewHolder
内部的 getItemViewType
的调用。