В классе не найдено сеттера / поля для изображения сердца - PullRequest
0 голосов
/ 09 ноября 2019

Я проверил все ответы на похожие проблемы, но мне ничего не помогло. Пожалуйста, помогите мне. Это приложение для электронной коммерции Android. Я использую Firebase для получения данных в карточках. У меня есть 3 продукта, добавленных в базу данных, и он показывает 3 пустые карты в приложении.

код genericproductmodel.java:

package com.beingdev.magicprint.models;

import java.io.Serializable;


public class GenericProductModel implements Serializable {

public int cardid;
public String cardname;
public String cardimage;
public String carddiscription;
public float cardprice;

public GenericProductModel() {
}

public GenericProductModel(String carddiscription, int cardid, String cardimage, String cardname, float cardprice) {
    this.carddiscription = carddiscription;
    this.cardid = cardid;
    this.cardimage = cardimage;
    this.cardname = cardname;
    this.cardprice = cardprice;
}

public String getCarddiscription() {
    return carddiscription;
}

public void setCarddiscription(String carddiscription) {
    this.carddiscription = carddiscription;
}

public int getCardid() {
    return cardid;
}

public void setCardid(int cardid) {
    this.cardid = cardid;
}

public String getCardimage() {
    return cardimage;
}

public void setCardimage(String cardimage) {
    this.cardimage = cardimage;
}

public String getCardname() {
    return cardname;
}

public void setCardname(String cardname) {
    this.cardname = cardname;
}


public float getCardprice() {
    return cardprice;
}

public void setCardprice(float cardprice) {
    this.cardprice = cardprice;
}


}

кодcards.java

package com.beingdev.magicprint.prodcutscategory;


import android.content.Intent;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import androidx.appcompat.widget.Toolbar;

import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.airbnb.lottie.LottieAnimationView;
import com.beingdev.magicprint.Cart;
import com.beingdev.magicprint.IndividualProduct;
import com.beingdev.magicprint.NotificationActivity;
import com.beingdev.magicprint.R;
import com.beingdev.magicprint.models.GenericProductModel;
import com.beingdev.magicprint.networksync.CheckInternetConnection;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.squareup.picasso.Picasso;

public class Cards extends AppCompatActivity {


//created for firebaseui android tutorial by Vamsi Tallapudi

private RecyclerView mRecyclerView;
private StaggeredGridLayoutManager mLayoutManager;
private LottieAnimationView tv_no_item;

//Getting reference to Firebase Database
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference mDatabaseReference = database.getReference();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cards);

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);

    //check Internet Connection
    new CheckInternetConnection(this).checkConnection();

    //Initializing our Recyclerview
    mRecyclerView = findViewById(R.id.my_recycler_view);
    tv_no_item = findViewById(R.id.tv_no_cards);


    if (mRecyclerView != null) {
        //to enable optimization of recyclerview
        mRecyclerView.setHasFixedSize(true);
    }
    //using staggered grid pattern in recyclerview
    mLayoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
    mRecyclerView.setLayoutManager(mLayoutManager);

    //Say Hello to our new FirebaseUI android Element, i.e., FirebaseRecyclerAdapter
    final FirebaseRecyclerAdapter<GenericProductModel, MovieViewHolder> adapter = new FirebaseRecyclerAdapter<GenericProductModel, MovieViewHolder>(
            GenericProductModel.class,
            R.layout.cards_cardview_layout,
            MovieViewHolder.class,
            //referencing the node where we want the database to store the data from our Object
            mDatabaseReference.child("Products").child("Cards").getRef()
    ) {
        @Override
        protected void populateViewHolder(final MovieViewHolder viewHolder, final GenericProductModel model, final int position) {
            if (tv_no_item.getVisibility() == View.VISIBLE) {
                tv_no_item.setVisibility(View.GONE);
            }
            viewHolder.cardname.setText(model.getCardname());
            viewHolder.cardprice.setText("₹ " + Float.toString(model.getCardprice()));
            Picasso.with(Cards.this).load(model.getCardimage()).into(viewHolder.cardimage);

            viewHolder.mView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Cards.this, IndividualProduct.class);
                    intent.putExtra("product", getItem(position));
                    startActivity(intent);
                }
            });
        }
    };


    mRecyclerView.setAdapter(adapter);

}

public void viewCart(View view) {
    startActivity(new Intent(Cards.this, Cart.class));
    finish();
}


//viewHolder for our Firebase UI
public static class MovieViewHolder extends RecyclerView.ViewHolder {

    TextView cardname;
    ImageView cardimage;
    TextView cardprice;

    View mView;

    public MovieViewHolder(View v) {
        super(v);
        mView = v;
        cardname = v.findViewById(R.id.cardcategory);
        cardimage = v.findViewById(R.id.cardimage);
        cardprice = v.findViewById(R.id.cardprice);
    }
}

public void Notifications(View view) {
    startActivity(new Intent(Cards.this, NotificationActivity.class));
    finish();
}

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

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

    //check Internet Connection
    new CheckInternetConnection(this).checkConnection();
}
}

logs:

W/ClassMapper: No setter/field for carddiscription found on class 
com.beingdev.magicprint.d.a
No setter/field for cardimage found on class 
com.beingdev.magicprint.d.a
No setter/field for cardname found on class 
com.beingdev.magicprint.d.a
No setter/field for cardid found on class com.beingdev.magicprint.d.a
No setter/field for cardprice found on class 
com.beingdev.magicprint.d.a

Скриншот Firebase:

This is the structure of firebase database

Скриншот приложения с 3 пустыми карточками:

1 Ответ

0 голосов
/ 15 ноября 2019

Похоже, что вы запутываете свой код, поэтому вы models.GenericProductModel стали d.a.

Чтобы исправить эту проблему, вы можете добавить правило в файл proguard, чтобы сохранить ваш класс после запутывания.

# To keep the specific class and all its properties and members.
-keep class com.beingdev.magicprint.models.GenericProductModel { *; }

# or to keep all classes under com.beingdev.magicprint
-keep class com.beingdev.magicprint.** { *; }

Или, в соответствии с документацией Firebase, вы можете аннотировать поля вашего класса аннотацией PropertyName () для переименования поля при его сериализации, например:

public class GenericProductModel implements Serializable {

@PropertyName("cardid")
public int cardId;

//...
}
...