Java 安卓系统–“;没有类型为'的封闭实例;some.abstract.class.name';“类在范围内”;扩展时出错
我有一个来自外部库的抽象适配器类:Java 安卓系统–“;没有类型为'的封闭实例;some.abstract.class.name';“类在范围内”;扩展时出错,java,android,abstract-class,extends,android-viewholder,Java,Android,Abstract Class,Extends,Android Viewholder,我有一个来自外部库的抽象适配器类: public abstract class DragItemAdapter<T, VH extends DragItemAdapter.ViewHolder> extends RecyclerView.Adapter<VH> { //Their other codes public class ViewHolder extends RecyclerView.ViewHolder { public View
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
}
}
}
有一个实时错误
作用域中没有类型为“library.package.name.DragItemAdapter”的封闭实例
以及编译时的错误
错误:需要包含DragItemAdapter.ViewHolder的封闭实例
从折射器使用“移动”也有同样的问题。我对这种……还是个新手嵌套类“所以我不知道这有什么问题,或者我应该包含更多什么类型的信息
谢谢!
ViewHolder
是DragItemAdapter
的内部类(因为它没有声明为static
)。这意味着类ViewHolder
的每个对象都必须与类DragItemAdapter
的对象相关联(实际上,它必须是DragItemAdapter
的子类)
DragItemAdapter __outerObject;
ViewHolder
可以直接访问属于\uu outerObject
的实例变量和方法
这意味着当你说newviewholder(…)
时,你必须有一些DragItemAdapter
,才能与ViewHolder
关联
这同样适用于ViewHolder
的任何子类,包括ViewHolderChecklist
,因为该子类继承了隐藏的\uu outerObject
变量
在第一个示例中,当ViewHolderChecklist
位于ChecklistAdapter
内时,将始终在checklistapter
实例上调用onCreateViewHolder
方法。当该方法表示new ViewHolderChecklist
时,新对象的\uu outerObject
将设置为ChecklistAdapter
实例。此外,如果外部类有一个ChecklistAdapter;
,它可以使用它创建一个新的ViewHolderChecklist
,方法是说adapter.new ViewHolderChecklist(…)
但是,当您将ViewHolderChecklist
移到类外时,无法创建新实例,因为无法使用new
来告诉它它的\u outerObject
应该是什么语法不起作用,因为这种语法只允许嵌套类使用,而且ViewHolderChecklist
不是嵌套类。因此ViewHolderChecklist
必须是dragiteAdapter
子类中的嵌套类
更正:实际上可以这样声明
ViewHolderChecklist
。但是,您必须给它一个显式构造函数,并且它必须有一个限定的超类构造函数调用(请参见;另请参见。有点类似,请看一看:感谢您的详细解释。您关于“必须是嵌套类”的结论"这证明了这是不可能的,并且节省了大量寻找解决方案的时间。请查看我的更正,尽管它很可能涉及到您不想使用的构造。谢谢,我会查看一下。哇,只需编辑几行就可以了。将ChecklistAdapter
的实例传递给viewholder返回新的ViewHolderForChecklist(view,grab,this);
然后使用该实例调用superadapter.super(itemView,grab);
在ViewHolderForChecklist
类中调用super?我认为它有点简单,那么,我不想使用它。在我看来,它可能会使代码更加晦涩。另一方面,如果有很好的理由这样做,这些理由可能会超过我的反对意见。也许有一天我会遇到一个我想使用它的案例。
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;
}
}
DragItemAdapter __outerObject;