我有3个不同的ArrayList
,每个都有来自特定对象的数据:Type_A
,Type_B
和Type_C
。每个字段都有一个字段private String name
,因此我将该字段移至Type_General
并将所有3种类型扩展为常规类型。
我想为每个项目列表使用一个适配器,我想如果它们都扩展相同类型(Type_General
)并且适配器使用List<Type_General>
我不会创建3种不同的适配器,适用于各种类型。
但是当我尝试为Type_A
实例化一个时,我很高兴我的IDE(Android Studio
)出现了红线错误,因为它需要List<Type_General>
并且我通过了{{1} }}
我的适配器类的代码:
List<Type_A>
由于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_A
和Type_B
的父类,因此不可行吗?
答案 0 :(得分: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>
来确保演员阵容。
答案 1 :(得分: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()));