我实现了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上阅读了这可能是一个库问题,但我不这样认为,我认为我缺少了一些东西,但我真的不知道这是什么吗?
如果您能解释为什么我可以解决它,我只需要知道!
谢谢。
答案 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类型的引用。要解决此问题,只需注释/删除这一行代码,然后仅使用第一行。