簡體   English   中英

創建通用類型適配器類不起作用

[英]Create Generic Type adapter class not working

我有3個不同的ArrayList ,每個都有來自特定對象的數據: Type_AType_BType_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_GeneralType_AType_BType_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM