Java 创建泛型类型适配器类无效
我有3个不同的Java 创建泛型类型适配器类无效,java,android,generics,Java,Android,Generics,我有3个不同的ArrayLists,每个都有来自特定对象的数据:Type\u a、Type\u B和Type\u C。每个字段都有一个字段私有字符串名称,因此我将该字段移动到类型_General,并使用所有3种类型来扩展General类型 我想为每个项目列表使用一个适配器,我想如果它们都扩展相同的类型(type\u General),并且适配器使用一个list,我就不必创建3个不同的适配器,每种类型一个 但有趣的是,当我尝试为类型A实例化一个时,我的IDE(Android Studio)中出现了
ArrayList
s,每个都有来自特定对象的数据:Type\u a
、Type\u B
和Type\u C
。每个字段都有一个字段私有字符串名称
,因此我将该字段移动到类型_General
,并使用所有3种类型来扩展General类型
我想为每个项目列表使用一个适配器,我想如果它们都扩展相同的类型(type\u General
),并且适配器使用一个list
,我就不必创建3个不同的适配器,每种类型一个
但有趣的是,当我尝试为类型A
实例化一个时,我的IDE(Android Studio
)中出现了一个红线错误,因为它需要一个列表,而我通过了List
我的适配器类的代码:
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();
}
}
class SuggestionAdapter扩展了RecyclerView.Adapter{
私有列表数据集;
私有EditProfileFragment.SuggestionEditTextEnum editTextEnum;
私人编辑文本;
私人回收站;
类ViewHolder扩展了RecyclerView.ViewHolder{
文本视图mTextView;
ViewHolder(文本视图v){
超级(五);
mTextView=v;
}
}
SuggestionAdapter(列出myDataset、EditProfileFragment.SuggestionEditTextEnum、editTextEnum、,
EditText EditText,RecyclerView RecyclerView){
mDataset=myDataset;
this.editTextEnum=editTextEnum;
this.editText=editText;
this.recyclerView=recyclerView;
}
@凌驾
公共建议Adapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext())
.充气(R.layout.textview_带圆角,父级,假);
返回新的ViewHolder((TextView)v);
}
@凌驾
BindViewHolder上的公共无效(最终建议Adapter.ViewHolder,最终int位置){
holder.mTextView.setText(大写首字母(mDataset.get(position.getName()));
holder.mTextView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
开关(editTextEnum){
案例类型_A:
recyclerView.setVisibility(View.GONE);
打破
案例类型_B:
recyclerView.setVisibility(View.GONE);
打破
案例类型_C:
recyclerView.setVisibility(View.GONE);
打破
}
}
});
}
公共作废附加项(类型\一般项){
mDataset.add(项);
}
公共无效添加项(列表项){
mDataset.clear();
mDataset.addAll(项目);
}
@凌驾
public int getItemCount(){
返回mDataset.size();
}
}
既然Type\u General
是Type\u A
、Type\u B
和Type\u C
的父类,那么这难道不应该起作用吗 此外,我认为您必须对数据进行显式转换,如下所示:
Type_General = mDataset.get(position);
if (Type_General instanceof Type_A){
Type_A = (TypeA) Type_General;
}
holder.mTextView.setText(capitalizeFirstLetter(TypeA.getName()));
集合
不能强制转换为集合
。这可能是编译器的限制
但是,只要合理地使用您的集合(我的意思是,使用List::add、List::addAll或任何其他方法,而不仅仅是简单地分配集合
),就不会有任何问题
如果你只是:
private final List<Type_General> mDataset = new ArrayList<>();
SuggestionsAdapter(List<? extends Type_General> myDataset, EditProfileFragment.SuggestionsEditTextEnum editTextEnum,
EditText editText, RecyclerView recyclerView) {
mDataset.addAll(myDataset);
}
private final List mDataset=new ArrayList();
SuggestionAdapter(ListCollection不能强制转换到集合中。但是您可以执行Collection Collection=(Collection)((Object)yourParentClassCollection)
,但这非常难看。没有stacktrace,这是他的IDE中的编译错误。如果我尝试运行它,我会得到:错误:(229,61)错误:不兼容的类型:列表无法转换为列表
我想我得到了它,而是将列表
传递给适配器,创建列表
,并在列表
中添加所有对象类型a
或类型B
,然后使用构造函数将其传递给适配器。