创建通用类型适配器类不起作用

时间:2017-02-23 12:37:07

标签: java android generics

我有3个不同的ArrayList,每个都有来自特定对象的数据:Type_AType_BType_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_GeneralType_AType_B的父类,因此不可行吗?

2 个答案:

答案 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()));