我有一个来自外部库的抽象适配器类:
public abstract class DragItemAdapter<T, VH extends DragItemAdapter.ViewHolder> extends RecyclerView.Adapter<VH> {
//Their other codes
public class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(final View itemView, int handleResId) {
super(itemView);
//The rest of their codes
}
}
}
我的适配器扩展了该适配器
public class ChecklistAdapter extends DragItemAdapter<Pair<Integer, SomeClass>, ViewHolderForChecklist> {
@Override
public ViewHolderForChecklist onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
grab = R.id.grab;
return new ViewHolderForChecklist(view,grab);
}
}
如果我的
ViewHolderForChecklist
是ChecklistAdapter
的内部类,则可以正常工作。但是如果我将ViewHolderForChecklist
转到一个全新的班级public class ViewHolderForChecklist extends DragItemAdapter<Pair<Long, SomeClass>, ViewHolderForChecklist>.ViewHolder { // The error is at this line
public ViewHolderForChecklist(final View itemView, int grab) {
super(itemView, grab);
}
@Override
public void onItemClicked(View view) {
}
@Override
public boolean onItemLongClicked(View view) {
return true;
}
}
实时存在错误
作用域中没有类型为'library.package.name.DragItemAdapter'的封闭实例
和编译时的错误
错误:包含DragItemAdapter.ViewHolder的封闭实例是必需的
使用Refractor中的“移动”具有相同的问题。我仍然对这种“嵌套类”还不陌生,所以我不知道这有什么问题,或者我应该包括哪些信息。
谢谢!
最佳答案
ViewHolder
是DragItemAdapter
的内部类(因为未声明为static
)。这意味着类ViewHolder
的每个对象都必须与类DragItemAdapter
的对象关联(实际上,它必须是DragItemAdapter
的子类)。您可以想到ViewHolder
具有隐藏的实例变量,例如
DragItemAdapter __outerObject;
ViewHolder
可以直接访问属于__outerObject
的实例变量和方法。这意味着当您说
new ViewHolder(...)
时,必须具有一些DragItemAdapter
才能与ViewHolder
关联。这同样适用于
ViewHolder
的任何子类,包括ViewHolderChecklist
,因为该子类继承了隐藏的__outerObject
变量。在第一个示例中,当
ViewHolderChecklist
在ChecklistAdapter
内部时,将始终在onCreateViewHolder
实例上调用ChecklistAdapter
方法。当该方法显示new ViewHolderChecklist
时,新对象的__outerObject
将设置为ChecklistAdapter
实例。另外,如果外部类具有ChecklistAdapter adapter;
,则可以通过说出ViewHolderChecklist
将其用于创建新的adapter.new ViewHolderChecklist(...)
。但是,当您将
ViewHolderChecklist
移到类之外时,将无法创建新实例,因为无法使用new
来告知__outerObject
应该是什么。 adapter.new ViewHolderChecklist(...)
语法将不起作用,因为该语法仅适用于嵌套类,而ViewHolderChecklist
不是嵌套类。因此,ViewHolderChecklist
必须是DragItemAdapter
子类内的嵌套类。更正:实际上可以这样声明
ViewHolderChecklist
。但是,您必须为其提供显式构造函数,并且必须具有合格的超类构造函数调用(请参见this;另请参见https://stackoverflow.com/questions/40501642/what-rule-prohibits-this-nested-class-reference/40501815)。关于java - Android-扩展时出现“范围内没有'some.abstract.class.name'类类型的封闭实例”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40500404/