8

私のfirebaseプロジェクトに問題があります。 私はfirebase GitHubのマニュアルの手順に従ったが、私はこの例外この例外の原因は何ですか?java.lang.NoSuchMethodException:<init> [クラスandroid.view.View]

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

を得た。この内部クラスではありませんViewHolderクラスです。

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); 
    } 
} 

、これは私がデータモデル、 とviewHolderクラスを移入するfirebaseRecyclerViewを使用していfirebase関連のコード

@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); 

ですが、私の活動

注意の内部クラスではありません。例外は、recyclerViewを含むアクティビティが開始されたときに発生します。

+0

下記の2つの原因が考えられます。そうでない場合は、問題を再現できる最小限のコードを含めるように質問してください(http://stackoverflow.com/posts/36972335/edit)。 –

+0

あなたの 'ProductViewHolder'コンストラクタはpublicではありません。 –

+0

問題が解決しました –

答えて

17

は、ほとんどの場合、カスタムViewHolderサブクラスは次のとおりです。

  • あなたはpublic static class MyViewHolderそれは静的なマークする必要があり、その場合にはpublic MyViewHolder(View itemView) {... } OR
  • クラスが別のクラス内で定義されたコンストラクタを、欠落しています。
+0

こんにちは@Frank van Puffelen、クラスが静的である必要がある理由を説明できますか?少し早いですがお礼を! – Jaco

+1

これは、POJOが別のクラスの内部クラスである場合にのみ必要です。その場合、Javaは隠しフィールドをクラスおよびパラメータに追加して、オブジェクトがそのコンテナを見つけることを可能にするデフォルトのコンストラクタに追加します。このパラメータは、Firebaseがデフォルトコンストラクタをもう見つけられないようにします。クラスを 'static'とマークすると、フィールドとパラメータが削除され、Firebaseはパラメータのないコンストラクタを再度見つけることができます。 –

+0

偉大な:)ありがとう@フランクヴァンPuffelen! – Jaco

関連する問題