2017-08-30 4 views
-3

私はViewHolderを私のRecyclerViewAdapterに持っています。ダイナミクスを受け取った位置に応じてビューを変更するためにそれらを使用しました。なぜmyViewHolderをキャストできないのですか?

@Override 
    public int getItemViewType(int position) { 

     int viewType = 0; 

     if (position == 0) { 
      viewType = 0; 
     }else if (position == 1){ 
      viewType = 1; 
     }else if (position == 2){ 
      viewType = 2; 
     } 

     return viewType; 

    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_notification, parent, false); 
     RecyclerView.ViewHolder viewHolder; 
     switch (viewType){ 
      case 0: 
       return new MyViewHolder(v); 
      case 1: 
       return new MyViewHolderAccepted(v); 
      case 2: 
       return new MyViewHolderRefused(v); 
      default: 
       return null; 
     } 

    } 

    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 
     final DataNotifications dataNotifications = list.get(position); 

    int type = Integer.valueOf(dataNotifications.getStatue()); 
    switch (getItemViewType(type)){ 
      case 0: 
       MyViewHolder myViewHolder = (MyViewHolder) holder; 
       ........ 
       break; 
      case 1: 
       MyViewHolderAccepted myViewHolderAccepted = (MyViewHolderAccepted) holder; 
       ....... 
       break; 
      case 2: 
       MyViewHolderRefused myViewHolderRefused = (MyViewHolderRefused) holder; 
       ........ 
       break; 
     } 


//  Glide.with(context).load(dataNotifications.getThumbnail()).into(holder.thumnail); 




    } 

私はこの例外を得た上記のコードを実行します。

私は各 ViewHolderに異なるレイアウトを持つべきNotificationAdapter $ MyViewHolderが NotificationAdapter $ MyViewHolderAccepted

にキャストすることはできません

? - しかし、私は1つだけTextViewの色を変更するので、それぞれViewHolderのレイアウトが高価になるでしょう。それはMyViewHolderない反対を拡張することMyViewHolderAcceptedだから

マイviewHolders

public class MyViewHolder extends RecyclerView.ViewHolder { 
     .... 


     public MyViewHolder(View itemView) { 
      super(itemView); 
      .... 
     } 
    } 
    public class MyViewHolderAccepted extends MyViewHolder{ 
     ... 

     public MyViewHolderAccepted(View itemView) { 
      super(itemView); 
      ... 
    } 

    public class MyViewHolderRefused extends MyViewHolder{ 


     public MyViewHolderRefused(View itemView) { 
      super(itemView); 
      .... 
     } 
    } 
+0

あなたが配列を渡す配列の長さ –

+0

downvoter理由を説明できますか? –

+0

@ V-rundプロットはどの配列ですか? –

答えて

1

NotificationAdapter $ MyViewHolder NotificationAdapter $ MyViewHolderAccepted

ほとんどの場合にキャストすることはできません。それとも、それをまったく拡張していない。拡張

class MyViewHolderAccepted extends MyViewHolder { 
    .... 

EDIT

注意が双方向ではありません。 BクラスがAに拡張されている場合、BAにキャストできますが、ABにはキャストできません。これはあなたがしていることです。

EDIT 2

(最終RecyclerView.ViewHolderホルダー

このonBindViewHolderます。public void。あなたはそれがすべて問題ないはずです。MyViewHolderするメソッドのシグネチャでholderタイプを変更する必要があります。

public void onBindViewHolder(final MyViewHolder holder 
+0

上記のチェックを編集してください。 –

+0

編集された回答を参照してください。 –

+0

sry、私は私の質問を更新しました。 –

関連する問題