Firebase数据库RecyclerView中的一个片段导致将数据库转换为字符串时出错

时间:2018-07-22 15:42:10

标签: java android firebase firebase-realtime-database android-recyclerview

我实现了TabLayout,我想在其中一个标签中显示我的Recyclerview,所以我创建了一个适配器:

public class AdapterFrag extends RecyclerView.ViewHolder {

public TextView Longitude;
public TextView Latitude;
public TextView mName;
public RatingBar mRatingbar;
public ProperRatingBar mPriceBar;
public TextView mOperationHours;
public TextView nOperationHours;
public TextView mDescription;


public AdapterFrag(View itemView){
            super(itemView);
            mName = (TextView) itemView.findViewById(R.id.name_view);
            mRatingbar = (RatingBar) 
   itemView.findViewById(R.id.mstarRatingBar);
            mPriceBar = (ProperRatingBar) 
   itemView.findViewById(R.id.dollarsignratingbar);
            mOperationHours = (TextView) 
   itemView.findViewById(R.id.hoursOfOperation_weekdays_firebase);
            nOperationHours = (TextView) 
   itemView.findViewById(R.id.hoursOfOperation_weekends_firebase);
            mDescription = (TextView) 
   itemView.findViewById(R.id.description_firebase);

        }
}

还有一个带有getters和setters的模型类以及一个构造函数,我确保数据库中的名称是相同的,没有像大写字母一样有趣的事情。

public class RestaurantModel {
private static final String TAG ="KARAM" ;
private String name;
private String Description;
private String image;
private String RestaurantId;
private String rating;
private String Price;
private String mOperationHours;
private String Longitude;
private String Latitude;
private String nOperationHours;


public RestaurantModel() {
}


public RestaurantModel(String name, String description, String image, String 
restaurantId, String rating, String price, String mOperationHours, String 
longitude, String latitude, String nOperationHours) {
    this.name = name;
    Description = description;
    this.image = image;
    RestaurantId = restaurantId;
    this.rating = rating;
    Price = price;
    this.mOperationHours = mOperationHours;
    Longitude = longitude;
    Latitude = latitude;
    this.nOperationHours = nOperationHours;
}




public String getnOperationHours() {

    return nOperationHours;
}

public void setnOperationHours(String nOperationHours) {
    this.nOperationHours = nOperationHours;
}
public String getmOperationHours() {

    return mOperationHours;
}

public void setmOperationHours(String mOperationHours) {
    this.mOperationHours = mOperationHours;
}

public String getLongitude() {
    return Longitude;
}

public void setLongitude(String longitude) {
    Longitude = longitude;
}

public String getLatitude() {
    return Latitude;
}

public void setLatitude(String latitude) {
    Latitude = latitude;
}


public String getPrice() {
    return Price;
}

public void setPrice(String price) {
    this.Price = price;
}


public String getName() {
    return name;
}

public String getDescription() {
    return Description;
}

public void setDescription(String description) {
    this.Description = description;
}
public void setName(String name) {
    this.name = name;
}

public String getImage() {
    return image;
}

public void setImage(String image) {
    this.image = image;
}

public String getRestaurantId() {
    return RestaurantId;
}

public void setRestaurantId(String restaurantId) {
    RestaurantId = restaurantId;
}

public String getRating() {
    return rating;
}

public void setRating(String rating) {
    this.rating = rating;
}
}

在我的主要活动持有人活动中,我实现了一个Viewpagerclass来设置片段管理器和类似这样的选项卡数量

public class main_intermediate extends AppCompatActivity {


String uniqueId;
String Entname;
String mName;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_intermediate);
    Toolbar toolbar = (Toolbar) findViewById(R.id.htab_toolbar);
    setSupportActionBar(toolbar);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.htab_tabs);
    tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
    tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    final ViewPager viewPager = (ViewPager) 
findViewById(R.id.htab_viewpager);
    final ViewPagerAdapter adapter = new 
ViewPagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new 
TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() 
{
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

    if (getIntent() != null) {
        Intent intentres = getIntent();
        if (intentres.hasExtra("uniqueId")) {
            uniqueId = intentres.getStringExtra("uniqueId");

        } else if (getIntent() != null) {
            Intent intentbar = getIntent();
            if (intentbar.hasExtra("name")) {
                mName = intentbar.getStringExtra("name");
                if (!mName.isEmpty() && mName != null) {
                    loadBarAndClubDetails(mName);
                }

            } else if (getIntent() != null) {
                Intent intentent = getIntent();
                if (intentent.hasExtra("Entname")) {
                    Entname = intentent.getStringExtra("Entname");
                    if (!Entname.isEmpty() && Entname != null) {
                        loadEntertainmentdetails(mName);
                    }
                }
            }
        }

    }
   }

    private void loadBarAndClubDetails(String mName) {
    }

    private void loadEntertainmentdetails(String mName) {
    }

    public class ViewPagerAdapter extends FragmentPagerAdapter {
    int mNumberOfTabs;

    ViewPagerAdapter(FragmentManager fm, int NumOfTabs) {
        super(fm);
        this.mNumberOfTabs = NumOfTabs;

    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                TabFragment1 tab1 = new TabFragment1();
                Bundle bundle = new Bundle();
                bundle.putString("uniqueId", uniqueId);
                tab1.setArguments(bundle);

                return tab1;
            case 1:
                TabFragment2 tab2 = new TabFragment2();
                 bundle = new Bundle();
                bundle.putString("uniqueId", uniqueId);
                tab2.setArguments(bundle);
                return tab2;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return mNumberOfTabs;
    }
}
}

最后,在片段中,我将xml文件中的recyclerview夸大了,并设置了一个recyclerview 然后我像这样设置firebaserecycleradapter

public class TabFragment1 extends android.support.v4.app.Fragment implements 
OnMapReadyCallback {
public TextView Longitude;
public TextView Latitude;
public TextView mName;
public RatingBar mRatingbar;
public ProperRatingBar mPriceBar;
public TextView mOperationHours;
public TextView nOperationHours;
public TextView mDescription;

RecyclerView mRecyclerView;
String resMid;
View mV;
GoogleMap mMap;
DatabaseReference mRestaurantId;
ProgressDialog progressDialog;
private String TAG = "Karam";


@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    mRestaurantId = database.getReference("Restaurant");

    if (getArguments() != null) {
        resMid = getArguments().getString("uniqueId");
        Log.d(TAG, "everything is safe till here :)" + resMid);

    } else { Log.d(TAG, "getArguments is null");}
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_tab_fragment_1, container, false);

    mRecyclerView = (RecyclerView) view.findViewById(R.id.mRecyclerView);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    mRestaurantId = mRestaurantId.child(resMid);

    FirebaseRecyclerAdapter<RestaurantModel,AdapterFrag> adapter = new 
FirebaseRecyclerAdapter<RestaurantModel, AdapterFrag>(
            RestaurantModel.class,
            R.layout.tab_fragment_1,
            AdapterFrag.class,
            mRestaurantId
    ) {
        @Override
        protected void populateViewHolder(AdapterFrag viewHolder, 
RestaurantModel model, int position) {

            mDescription.setText(model.getDescription());
            mPriceBar.setRating(Integer.parseInt(model.getPrice()));
            mRatingbar.setRating(Integer.parseInt(model.getRating()));
            mName.setText(model.getName());
            mOperationHours.setText(model.getmOperationHours());
            nOperationHours.setText(model.getnOperationHours());
        }
    };

        mRecyclerView.setAdapter(adapter);

    return view;
}





}

但是它没有填充,并且给了我这样的错误:

07-22 18:27:20.451 20797-20797/com.example.karam.nlcg E/AndroidRuntime: FATAL 
EXCEPTION: main
Process: com.example.karam.nlcg, PID: 20797
com.google.firebase.database.DatabaseException: Can't convert object of type 
java.lang.String to type com.example.karam.nlcg.Restaurant.RestaurantModel
    at com.google.android.gms.internal.firebase_
database.zzkt.zzb(Unknown Source:259)
    at com.google.android.gms.internal.
firebase_database.zzkt.zza(Unknown Source:0)
    at com.google.firebase.database.DataSnapshot.getValue(Unknown Source:10)
    at com.firebase.ui.database.FirebaseRecyclerAdapter.
parseSnapshot(FirebaseRecyclerAdapter.java:147)
    at com.firebase.ui.database.FirebaseRecyclerAdapter.
getItem(FirebaseRecyclerAdapter.java:136)
    at com.firebase.ui.database.FirebaseRecyclerAdapter.
onBindViewHolder(FirebaseRecyclerAdapter.java:176)
    at android.support.v7.widget.RecyclerView$Adapter.
onBindViewHolder(RecyclerView.java:6673)
    at android.support.v7.widget.RecyclerView$Adapter.
bindViewHolder(RecyclerView.java:6714)
    at 
android.support.v7.widget.RecyclerView$Recycler.
tryBindViewHolderByDeadline(RecyclerView.java:5647)

我在github上阅读了这可能是一个库问题,但我不这样认为,我认为我缺少了一些东西,但我真的不知道这是什么吗?

如果您能解释为什么我可以解决它,我只需要知道!

谢谢。

enter image description here

2 个答案:

答案 0 :(得分:0)

请参阅您的firebase结构具有属性菜单,但是您的模型(RestaurantModel)没有该属性。

RestaurantModel仅具有字符串类型的属性。

因此,对您的问题的答案是修改您的RestaurantModel

已更新

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    mRestaurantId = database.getReference("Restaurant");


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_tab_fragment_1, container, false);

        mRecyclerView = (RecyclerView) view.findViewById(R.id.mRecyclerView);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));


        FirebaseRecyclerAdapter<RestaurantModel,AdapterFrag> adapter = new 
        FirebaseRecyclerAdapter<RestaurantModel, AdapterFrag>(
            RestaurantModel.class,
            R.layout.tab_fragment_1,
            AdapterFrag.class,
            mRestaurantId
        )
    }
}

答案 1 :(得分:0)

您遇到以下错误:

Can't convert object of type java.lang.String to type com.example.karam.nlcg.Restaurant.RestaurantModel

因为您的mRestaurantId对象指向String类型而不是RestaurantModel类型的引用。发生这种情况是因为您首先将其初始化为:

mRestaurantId = database.getReference("Restaurant");

然后您将其更改为:

mRestaurantId = mRestaurantId.child(resMid);

显然是指向String类型的引用。要解决此问题,只需注释/删除这一行代码,然后仅使用第一行。