8

Ho un problema con il mio progetto firebase. Ho seguito i passaggi su firebase documentazione GitHub, ma ho avuto questa eccezioneCosa causa questa eccezione java.lang.RuntimeException: java.lang.NoSuchMethodException: <init> [class android.view.View]

java.lang.RuntimeException: java.lang.NoSuchMethodException: <init> 
[class android.view.View] 

questa è una classe ViewHolder che non è una classe interna.

public class ProductViewHolder extends RecyclerView.ViewHolder{ 
public View mView; 
public ImageView img; 
public TextView title; 
public TextView price; 
public RatingBar stars; 


ProductViewHolder(View itemView) { 
    super(itemView); 

    mView = itemView; 
    img = (ImageView) itemView.findViewById(R.id.productImg); 
    title = (TextView) itemView.findViewById(R.id.txtTitle); 
    price = (TextView) itemView.findViewById(R.id.txtPrice); 
    stars = (RatingBar) itemView.findViewById(R.id.ratingBar); 
    } 
} 

e questa è la Firebase relativi codice

@Override 
protected void onStart() { 
    super.onStart(); 

    // Recycler adapter 
    FirebaseRecyclerAdapter<Product, ProductViewHolder> adapter = 
      new FirebaseRecyclerAdapter<Product, ProductViewHolder>(
        Product.class, 
        R.layout.product_list_item, 
        ProductViewHolder.class, 
        firebaseRef.child("product")) { 

       @Override 
       protected void populateViewHolder(ProductViewHolder productViewHolder, Product product, int i) { 
        Picasso.with(ShopsApp.getLyShopsAppContext()) 
          .load(product.getImgUrl()) 
          .placeholder(R.drawable.none) 
          .into(productViewHolder.img); 
        productViewHolder.title.setText(product.getTitle()); 
        productViewHolder.price.setText(product.getPrice()); 
        productViewHolder.stars.setRating(4.0f); 
       } 
      }; 

    recyclerView1.setAdapter(adapter); 

sto usando firebaseRecyclerView per popolare modello di dati, e la classe non è viewHolder classe interna della mia attività

Nota: l'eccezione si verifica quando inizia l'attività che contiene recyclerView.

+0

Due possibili cause di seguito. Se quelli non lo sono, [modifica] (http://stackoverflow.com/posts/36972335/edit) la tua domanda per includere il codice minimo con il quale possiamo riprodurre il problema. –

+0

Il costruttore 'ProductViewHolder' non è pubblico. –

+0

Il problema risolto Thans molto –

risposta

17

Molto probabilmente la vostra abitudine ViewHolder sottoclasse è:

  • manca un costruttore public MyViewHolder(View itemView) {... } O
  • la classe è definita all'interno di un'altra classe, nel qual caso è necessario marcare come statici public static class MyViewHolder.
+0

Salve @Frank van Puffelen, potresti spiegare perché la classe deve essere statica? Grazie in anticipo! – Jaco

+1

Questo è necessario solo quando il POJO è una classe interna in un'altra classe. In tal caso, Java aggiunge un campo nascosto alla classe e un parametro al costruttore predefinito che consente all'oggetto di trovare il suo contenitore. Questo parametro consente a Firebase di non trovare più il costruttore predefinito. Marcare la classe come 'statico' rimuove il campo e il parametro e quindi Firebase può trovare nuovamente il costruttore senza parametri. –

+0

Fantastico :) Grazie a @Frank van Puffelen! – Jaco

Problemi correlati