2017-02-23 54 views
0

我有3个不同的ArrayList s和每个具有来自特定对象的数据:Type_A,Type_BType_C。每个人都有一个字段private String name,所以我将该字段移至Type_General,并将所有3种类型扩展为一般类型。创建通用类型适配器类不工作

我想用一个适配器项目的每个列表,我想,如果他们都继承同一类型(Type_General)和适配器使用List<Type_General>我不会要创建3个不同的适配器,一个用于所有类型。

但要因为它需要一个List<Type_General>,我通过我的Adapter类的List<Type_A>

代码我游时,我试图实例化一个Type_A我在我的IDE(Android Studio)有一个红线错误:

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_GeneralType_A,Type_BType_C的父类,不应该这样工作吗?

+0

收藏品不能铸造到集合。但是你可以做'Collection collection =(Collection )((Object)yourParentClassCollection)',但这很丑陋。 –

回答

1

Collection<ChildClass>不能被铸造成Collection<ParentClass>。这可能是一个编译器限制。

然而,正确使用你的集合(我的意思是,使用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); 
    } 

世上本没有错误,会不会有?

编辑:

我忘了说:你可以确保从一开始就宣布List<? extends Type_General>投。

0

您能和我们分享您的stacktrace吗?

另外,我认为你必须做一个Explicit Cast你的数据是这样的:

Type_General = mDataset.get(position); 

if (Type_General instanceof Type_A){ 

    Type_A = (TypeA) Type_General; 
} 

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

没有堆栈跟踪,这是他的IDE中的编译错误。 –

+0

如果我尝试运行它,我会得到:'错误:(229,61)错误:不兼容的类型:列表无法转换为列表' – vicolored

+0

我想我知道了,而不是通过'列表 '创建一个'List '并在'List '中添加所有对象'Type_A'或'Type_B',然后使用构造函数将它传递给适配器。 –

相关问题