2017-02-23 10 views
0

私は3種類の異なるArrayListを持っていて、それぞれ特定のオブジェクトのデータを持っています:Type_A,Type_BおよびType_Cです。各フィールドにはフィールドprivate String nameがありますので、そのフィールドをType_Generalに移動し、3つのタイプすべてを汎用タイプに拡張しました。Generic Typeアダプタクラスを作成できません

アイテムのリストごとにアダプタを使いたいのですが、それらがすべて同じタイプ(Type_General)を拡張していて、アダプタがList<Type_General>を使用していると思ったので、3種類のアダプタを作成する必要はありません。

しかし、それはList<Type_General>を期待し、私は私のアダプタクラスのList<Type_A>

コードを渡し原因私は私が私のIDE(Android Studio)に赤い線のエラーを得たType_Aのための1つのインスタンス化しようとした私の遊園地へ

class SuggestionsAdapter extends RecyclerView.Adapter<SuggestionsAdapter.ViewHolder> { 

private List<Type_General> mDataset; 
private EditProfileFragment.SuggestionsEditTextEnum editTextEnum; 
private EditText editText; 
private RecyclerView recyclerView; 

class ViewHolder extends RecyclerView.ViewHolder { 
    TextView mTextView; 
    ViewHolder(TextView v) { 
     super(v); 
     mTextView = v; 
    } 
} 

SuggestionsAdapter(List<Type_General> myDataset, EditProfileFragment.SuggestionsEditTextEnum editTextEnum, 
        EditText editText, RecyclerView recyclerView) { 
    mDataset = myDataset; 
    this.editTextEnum = editTextEnum; 
    this.editText = editText; 
    this.recyclerView = recyclerView; 
} 

@Override 
public SuggestionsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.textview_with_rounded_corners, parent, false); 

    return new ViewHolder((TextView) v); 
} 

@Override 
public void onBindViewHolder(final SuggestionsAdapter.ViewHolder holder, final int position) { 
    holder.mTextView.setText(capitalizeFirstLetter(mDataset.get(position).getName())); 
    holder.mTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      switch (editTextEnum) { 
       case Type_A: 
        recyclerView.setVisibility(View.GONE); 
        break; 
       case Type_B: 
        recyclerView.setVisibility(View.GONE); 
        break; 
       case Type_C: 
        recyclerView.setVisibility(View.GONE); 
        break; 
      } 
     } 
    }); 
} 

public void addItem(Type_General item) { 
    mDataset.add(item); 
} 

public void addAllItems(List<Type_General> items) { 
    mDataset.clear(); 
    mDataset.addAll(items); 
} 

@Override 
public int getItemCount() { 
    return mDataset.size(); 
} 

} 

Type_Generalは、Type_AType_BType_Cの親クラスですか?

+0

コレクションは、コレクションにキャストすることはできません。しかし、あなたは 'Collection collection =(Collection )((Object)yourParentClassCollection)'を実行できますが、それはかなり醜いです。 –

答えて

1

Collection<ChildClass>Collection<ParentClass>にキャストすることはできません。

はまた、私はあなたがこのようなExplicit Castあなたのデータがしなければならないと思います。それはコンパイラの制限かもしれません。

しかし、List :: add、List :: addAll、または単にCollection<ChildClass>の単純な割り当て以外の何かを使用して、あなたのコレクションのまともな使用で、何か問題があってはいけません。

あなたは、単に持っていた場合:

private final List<Type_General> mDataset = new ArrayList<>(); 

    SuggestionsAdapter(List<? extends Type_General> myDataset, EditProfileFragment.SuggestionsEditTextEnum editTextEnum, 
         EditText editText, RecyclerView recyclerView) { 
     mDataset.addAll(myDataset); 
    } 

がだろう、エラーがあるのではないでしょうか?

EDIT:

私が言うのを忘れて:あなたは、最初からList<? extends Type_General>を宣言すると、キャストを確保することができます。

0

stacktraceさんと私を共有できますか?

Type_General = mDataset.get(position); 

if (Type_General instanceof Type_A){ 

    Type_A = (TypeA) Type_General; 
} 

holder.mTextView.setText(capitalizeFirstLetter(TypeA.getName())); 
+0

stacktraceはありません。彼のIDEにはコンパイルエラーがあります。 –

+0

エラー:(229、61)エラー:互換性のない型:リストはリストに変換できません ' – vicolored

+0

' 'リスト '' List 'を作成し、' List '内のオブジェクト' Type_A'または 'Type_B'をすべて追加して、コンストラクタを使用してアダプタに渡します。 –

関連する問題