2016-01-29 1 views
3

Je suivais un exemple RecyclerView et j'ai cette erreurtypes incompatibles: ne peut pas lancer viewholder à imageviewholder

incompatible types: cannot cast viewholder to imageviewholder 

sur ce code

case TYPE_IMAGE: 
      ImageViewHolder imageViewHolder = (ImageViewHolder) holder; 

c'est mon code complet (modifié)

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    private ArrayList<String> mDataset; 

    public class ImageViewHolder extends RecyclerView.ViewHolder { 
     //ImageView mImage; 
     public TextView txtHeader; 
     public TextView txtFooter; 
     public ImageViewHolder(View itemView) { 
      super (itemView); 
      txtHeader = (TextView) itemView.findViewById(R.id.firstLine1); 
      txtFooter = (TextView) itemView.findViewById(R.id.secondLine1); 
     } 
    } 

    // Provide a reference to the views for each data item 
    // Complex data items may need more than one view per item, and 
    // you provide access to all the views for a data item in a view holder 
    public class TextViewHolder extends RecyclerView.ViewHolder { 
     // each data item is just a string in this case 
     public TextView txtHeader; 
     public TextView txtFooter; 

     public TextViewHolder(View v) { 
      super(v); 
      txtHeader = (TextView) v.findViewById(R.id.firstLine); 
      txtFooter = (TextView) v.findViewById(R.id.secondLine); 
     } 
    } 

    public void add(int position, String item) { 
     mDataset.add(position, item); 
     notifyItemInserted(position); 
    } 

    public void remove(String item) { 
     int position = mDataset.indexOf(item); 
     mDataset.remove(position); 
     notifyItemRemoved(position); 
    } 

    // Provide a suitable constructor (depends on the kind of dataset) 
    public MyAdapter(ArrayList<String> myDataset) { 
     mDataset = myDataset; 
    } 

    // Create new views (invoked by the layout manager) 
    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, 
                int viewType) { 
     // create a new view 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false); 
     // set the view's size, margins, paddings and layout parameters 
     TextViewHolder vh = new TextViewHolder(v); 
     return vh; 
    } 

    private static final int TYPE_IMAGE = 1; 
    private static final int TYPE_GROUP = 2; 

    @Override 
    public int getItemViewType(int position) { 
     // here your custom logic to choose the view type 
     return position == 0 ? TYPE_IMAGE : TYPE_GROUP; 
    } 

    // Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder TextViewHolder, int position) { 

     switch (TextViewHolder.getItemViewType()) { 

      case TYPE_IMAGE: 
       ImageViewHolder imageViewHolder = (ImageViewHolder) TextViewHolder; 
       // imageViewHolder.mImage.setImageResource(...); 
       final String namev = mDataset.get(position); 
       imageViewHolder.txtHeader.setText(mDataset.get(position)); 
       imageViewHolder.txtHeader.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         remove(namev); 
        } 
       }); 

       break; 

      case TYPE_GROUP: 
       TextViewHolder viewHolder = (TextViewHolder) TextViewHolder; 
       // viewHolder.txtHeader.setText(...) 
       final String name = mDataset.get(position); 
       viewHolder.txtHeader.setText(mDataset.get(position)); 
       viewHolder.txtHeader.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         remove(name); 
        } 
       }); 

       viewHolder.txtFooter.setText("Footer: " + mDataset.get(position)); 

       break; 
     } 
/* 
     // - get element from your dataset at this position 
     // - replace the contents of the view with that element 
     final String name = mDataset.get(position); 
     holder.txtHeader.setText(mDataset.get(position)); 
     holder.txtHeader.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       remove(name); 
      } 
     }); 

     holder.txtFooter.setText("Footer: " + mDataset.get(position)); 
*/ 
    } 

    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return mDataset.size(); 
    } 

} 

erreur ici

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, 
               int viewType) { 
    switch (viewType) { 

     case TYPE_IMAGE: { 
      View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false); 
      // return new ImageViewHolder(itemView); 
      ImageViewHolder vh = new ImageViewHolder(itemView); 
      return vh; 
     } 
     case TYPE_GROUP: { 
      View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false); 
      // return new TextViewHolder(itemView); 
      TextViewHolder vh = new TextViewHolder(itemView); 
      return vh; 
     } 
    } 
}// error here missing return statement 
+0

ImageViewHolder étend-il ou implémente-t-il ViewHolder? Sinon, cette distribution ne fonctionnera pas. –

+0

@GabeSechan oui comme je l'ai posté dans mon code 'public class ImageViewHolder étend RecyclerView.ViewHolder {' – Moudiz

+0

Vous avez 'MyAdapter' étendant' RecyclerView.Adapter 'et' ImageViewHolder' étendant 'RecyclerView.ViewHolder'. – thetonrifles

Répondre

2

C'est un fichier mis à jour:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    private ArrayList<String> mDataset; 

    public class ImageViewHolder extends RecyclerView.ViewHolder { 
     //ImageView mImage; 
     public TextView txtHeader; 
     public TextView txtFooter; 
     public ImageViewHolder(View itemView) { 
      super (itemView); 
      txtHeader = (TextView) itemView.findViewById(R.id.firstLine1); 
      txtFooter = (TextView) itemView.findViewById(R.id.secondLine1); 
     } 
    } 

    // Provide a reference to the views for each data item 
    // Complex data items may need more than one view per item, and 
    // you provide access to all the views for a data item in a view holder 
    public class TextViewHolder extends RecyclerView.ViewHolder { 
     // each data item is just a string in this case 
     public TextView txtHeader; 
     public TextView txtFooter; 

     public TextViewHolder(View v) { 
      super(v); 
      txtHeader = (TextView) v.findViewById(R.id.firstLine); 
      txtFooter = (TextView) v.findViewById(R.id.secondLine); 
     } 
    } 

    public void add(int position, String item) { 
     mDataset.add(position, item); 
     notifyItemInserted(position); 
    } 

    public void remove(String item) { 
     int position = mDataset.indexOf(item); 
     mDataset.remove(position); 
     notifyItemRemoved(position); 
    } 

    // Provide a suitable constructor (depends on the kind of dataset) 
    public MyAdapter(ArrayList<String> myDataset) { 
     mDataset = myDataset; 
    } 

    // Create new views (invoked by the layout manager) 
    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, 
                 int viewType) { 
     if (viewType == TYPE_IMAGE) { 
      // create a new view 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false); 
      // set the view's size, margins, paddings and layout parameters 
      ImageViewHolder vh = new ImageViewHolder(v); 
      return vh; 
     } else { 
      // create a new view 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false); 
      // set the view's size, margins, paddings and layout parameters 
      TextViewHolder vh = new TextViewHolder(v); 
      return vh; 
     } 
    } 

    private static final int TYPE_IMAGE = 1; 
    private static final int TYPE_GROUP = 2; 

    @Override 
    public int getItemViewType(int position) { 
     // here your custom logic to choose the view type 
     return position == 0 ? TYPE_IMAGE : TYPE_GROUP; 
    } 

    // Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder TextViewHolder, int position) { 

     switch (TextViewHolder.getItemViewType()) { 

      case TYPE_IMAGE: 
       ImageViewHolder imageViewHolder = (ImageViewHolder) TextViewHolder; 
       // imageViewHolder.mImage.setImageResource(...); 
       final String namev = mDataset.get(position); 
       imageViewHolder.txtHeader.setText(mDataset.get(position)); 
       imageViewHolder.txtHeader.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         remove(namev); 
        } 
       }); 

       break; 

      case TYPE_GROUP: 
       TextViewHolder viewHolder = (TextViewHolder) TextViewHolder; 
       // viewHolder.txtHeader.setText(...) 
       final String name = mDataset.get(position); 
       viewHolder.txtHeader.setText(mDataset.get(position)); 
       viewHolder.txtHeader.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         remove(name); 
        } 
       }); 

       viewHolder.txtFooter.setText("Footer: " + mDataset.get(position)); 

       break; 
     } 
/* 
     // - get element from your dataset at this position 
     // - replace the contents of the view with that element 
     final String name = mDataset.get(position); 
     holder.txtHeader.setText(mDataset.get(position)); 
     holder.txtHeader.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       remove(name); 
      } 
     }); 

     holder.txtFooter.setText("Footer: " + mDataset.get(position)); 
*/ 
    } 

    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return mDataset.size(); 
    } 

} 
+0

J'ai fait ce que vous écrivez, mais j'ai cette erreur, vérifiez s'il vous plaît mon code de mise à jour java.lang.ClassCastException: com..wwi.i.MyAdapter $ TextViewHolder ne peut pas être cast .. www.i.MyAdapter $ ImageViewHolder – Moudiz

+0

@Moudiz vous avez maintenant cette erreur à l'exécution? Je demande parce que l'implémentation de onCreateViewHolder ne prend pas en compte le type de vue – thetonrifles

+0

oui à l'exécution correct. – Moudiz

3

Vous devez changer:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.TextViewHolder> 

pour:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 

Et puis changer votre onCreateViewHolder afin d'accepter plusieurs ViewTypes:

@Override 
    public MyAdapter.TextViewHolder onCreateViewHolder(ViewGroup parent, 
               int viewType) 

pour:

@Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, 
               int viewType) 

Et puis changer la méthode onBindViewHolder:

@Override 
public void onBindViewHolder(TextViewHolder TextViewHolder, int position) 

pour:

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 

Et ne pas oublier de définir vos types de ViewHolder:

@Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, 
               int viewType){ 
    switch (viewType) { 

     case TYPE_IMAGE: { 
      View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.XXX, parent, false); 
      return new ImageViewHolder(itemView); 
      } 
     case TYPE_GROUP: { 
      View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.XXX, parent, false); 
      return new TextViewHolder(itemView); 
      } 
     } 
+0

qu'en est-il de cette ligne, j'ai changé comme ceci, est-ce correct? public void onBindViewHolder (RecyclerView.ViewHolder TextViewHolder, position int) { – Moudiz

+0

Oui sory, je vais modifier cela – JpCrow

+0

J'ai eu cette erreur java.lang.ClassCastException: com..wwi.i.MyAdapter $ TextViewHolder ne peut pas être cast .. www.i.MyAdapter $ ImageViewHolder vérifier ma réponse d'édition pour mon dernier code – Moudiz