Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓系统–“;没有类型为'的封闭实例;some.abstract.class.name';“类在范围内”;扩展时出错_Java_Android_Abstract Class_Extends_Android Viewholder - Fatal编程技术网

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);
然后使用该实例调用super
adapter.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;