2016-11-09 46 views
2

我有一个抽象适配器类从外部库:Android的 - “型‘some.abstract.class.name’没有封闭实例类的范围是”错误时延长

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; 
    } 
} 

有实时

No enclosing instance of type 'library.package.name.DragItemAdapter' class is in scope

错误,并使用“移动”,从折射错误时编译

error: an enclosing instance that contains DragItemAdapter.ViewHolder is required

有同样的问题。我还是新来这样......“嵌套类的”,所以我不知道什么是错的这样或什么样的信息我应该包括更多。

谢谢!

+0

类似的,请看一下:http://stackoverflow.com/a/22117161/3931910 – YakuZa

回答

1

ViewHolder内部类DragItemAdapter(因为它没有被宣布为static)。这意味着类ViewHolder的每个对象都必须与类DragItemAdapter(实际上,它必须是DragItemAdapter的子类)的对象相关联。可以想到ViewHolder有一个隐藏的实例变量,如

DragItemAdapter __outerObject; 

ViewHolder可以直接访问属于__outerObject的实例变量和方法。

这意味着当你说new ViewHolder(...)时,你必须有一些DragItemAdapterViewHolder相关联。

这同样适用于的ViewHolder任何亚类,包括ViewHolderChecklist,由于子类继承隐藏__outerObject变量。

在第一个例子,其中ViewHolderChecklistChecklistAdapter内部,onCreateViewHolder方法将始终在ChecklistAdapter实例调用。当该方法表示new ViewHolderChecklist时,新对象的__outerObject将设置为ChecklistAdapter实例。另外,如果外部课程有ChecklistAdapter adapter;,则可以用adapter.new ViewHolderChecklist(...)来创建新的ViewHolderChecklist

当您移动ViewHolderChecklist类外,虽然,有没有办法要创建一个新的实例,因为没有办法的方式,会告诉它的__outerObject什么应该是使用newadapter.new ViewHolderChecklist(...)语法不起作用,因为该语法只能用于嵌套类,并且ViewHolderChecklist不是嵌套类。因此ViewHolderChecklist必须是DragItemAdapter的子类中的嵌套类。

纠错:实际上可以这样宣布ViewHolderChecklist。但是,必须给它一个明确的构造函数,并且必须具有合格的超类构造函数调用(请参阅this;另请参阅https://stackoverflow.com/questions/40501642/what-rule-prohibits-this-nested-class-reference/40501815

+0

感谢您的详细解释,您的结论“必须是一个嵌套的课程”,证明这是不可能的,并且可以节省大量的时间寻找解决方案 –

+0

请参阅我的更正,尽管最可能涉及构造你不想使用 – ajb

+0

谢谢,我来看看 –

相关问题