[英]Create Generic Type adapter class not working
我有3個不同的ArrayList
,每個都有來自特定對象的數據: Type_A
, Type_B
和Type_C
。 每個字段都有一個字段private String name
因此我將該字段移至Type_General
並設置了所有3種類型以擴展常規類型。
我想為每個項目列表使用一個適配器,我想如果它們都擴展相同的類型( Type_General
),並且適配器使用一個List<Type_General>
我將不必創建3個不同的適配器,每種類型一個。
但是當我嘗試實例化Type_A
我很Type_A
我在IDE( Android Studio
)中出現紅線錯誤,原因是它期望List<Type_General>
並傳遞List<Type_A>
我的Adapter類的代碼:
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
和Type_C
的父類, Type_B
Type_C
嗎?
無法將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>
來確保演員陣容List<? extends Type_General>
從一開始就List<? extends Type_General>
。
另外,我認為您必須像這樣Explicit Cast
數據:
Type_General = mDataset.get(position);
if (Type_General instanceof Type_A){
Type_A = (TypeA) Type_General;
}
holder.mTextView.setText(capitalizeFirstLetter(TypeA.getName()));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.