2016-11-09 47 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

謝謝,我來看看 –

相關問題