我正在尝试从 Firebase 填充一个 recyclerView。将项目添加到数据库,最终 recyclerView 工作正常(我可以通过控制台以及 Android 监视器上的标签看到它)。 RV 得到填充,在 listItems 中我有两个 TextView,它们应该从数据库中检索它们的文本。
我的问题是那两个 textView 没有出现。我做了很多研究,我认为我的问题是反序列化。
从这里我通过 fragment 添加一个项目:
public void addLanguage(){
//ADDING A LANGUAGE COLOR CAN BE DONE HERE THROUGH AN ARRAY ON MANUALLY
String mUserId= fUser.getUid();
final FirebaseDatabase database= FirebaseDatabase.getInstance();
final DatabaseReference fDatabase= FirebaseDatabase.getInstance().getReference();
//String key= database.getReference("languagesList").push().getKey();
String key= fDatabase.child("user").child(mUserId).child("languagesList").push().getKey();
Languages language= new Languages();
language.setSourceLanguage(sources_edit.getText().toString());
language.setTargetLanguage(target_edit.getText().toString());
Map<String, Object> childUpadate= new HashMap<>();
childUpadate.put(key, language.toFirbaseObject());
fDatabase.child(mUserId).child("languagesList").updateChildren(childUpadate, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError == null) {
dismiss();
}else{
Toast.makeText(getActivity(), databaseError.getMessage(), Toast.LENGTH_LONG).show();
}
}
});
}
这是我的房车所在的 Activity
public void loadData(){
databaseRef.child(mUserId).child("languagesList").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
languagesList.clear();
Log.w("langApp", "getUser:onCancelled " + dataSnapshot.toString());
Log.w("langApp", "count = " + String.valueOf(dataSnapshot.getChildrenCount()) + " values " + dataSnapshot.getKey());
for(DataSnapshot data : dataSnapshot.getChildren()){
// GenericTypeIndicator<Map<String, Languages >> languageMap= new GenericTypeIndicator<Map<String, Languages>>(){};
// Map<String, Languages> language= dataSnapshot.getValue(languageMap);
Languages languages= data.getValue(Languages.class);
languagesList.add(languages);
}
adapter.notifyDataSetChanged();
spinKitView.setVisibility(View.GONE);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w("langApp", "getUser:onCancelled", databaseError.toException());
}
});
}
这是我的对象类
public class Languages implements Serializable {
public String sourceLanguage, targetLanguage;
public Languages(){
}
public String getSourceLanguage() {
return sourceLanguage;
}
public void setSourceLanguage(String sourceLanguage) {
this.sourceLanguage = sourceLanguage;
}
public String getTargetLanguage() {
return targetLanguage;
}
public void setTargetLanguage(String targetLanguage) {
this.targetLanguage = targetLanguage;
}
public HashMap<String, String> toFirbaseObject(){
HashMap<String, String> language= new HashMap<String, String>();
language.put("source", sourceLanguage);
language.put("target", targetLanguage);
return language;
}
}
RV 适配器是 Activity 内部的内部类
public class RecyclerAdapter extends RecyclerView.Adapter{
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
RecyclerAdapter.mViewHolder cVH= new mViewHolder(v);
return cVH;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
mViewHolder mViewHolder= (mViewHolder)holder;
mViewHolder.position= position;
Languages languages= languagesList.get(position);
((mViewHolder) holder).sourceText.setText(languages.getSourceLanguage());
((mViewHolder) holder).targetText.setText(languages.getTargetLanguage());
}
@Override
public int getItemCount() {
return languagesList.size();
}
public final class mViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView sourceText, targetText;
public int position;
public mViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
sourceText= (TextView)itemView.findViewById(R.id.source_language);
targetText= (TextView)itemView.findViewById(R.id.target_language);
}
@Override
public void onClick(View v) {
}
}
}
json
{
{ "kVRxDib8SJdQWRc1TULthqY7S6e2" : {
"languagesList" : {
"-Kv2fKiiV5XAjo6lW9Eg" : {
"source" : "Kejan",
"target" : "Dachn"
},
"-Kv2hoV2eIEMcme6Akje" : {
"source" : "Se",
"target" : "Se"
},
"-Kv2iPJqEn7l6hP4gEzI" : {
"source" : "Ay ",
"target" : "Way"
},
"-Kv38J06mO8o1YudzXXY" : {
"source" : "Aaa",
"target" : "Zdsss"
},
"-Kv38d9b5ihF2sMADk3t" : {
"source" : "Madri ",
"target" : "Algomar"
}
}
}
}
list :`
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity android:name=".Authentication.SignupActivity" />
<activity android:name=".Authentication.ResetPasswordActivity" />
<activity android:name=".Authentication.LoginActivity" />
<activity android:name=".Authentication.ProfileSettings" />
<activity
android:name=".DrawerActivity"
android:label="@string/title_activity_drawer"
android:theme="@style/AppTheme" />
<activity
android:name=".LanguagesActivity"
android:label="@string/title_activity_languages"
android:theme="@style/AppTheme" />
<activity android:name=".Settings" />
<activity android:name=".Authentication.SignupActivityTwo"></activity>
</application>
`
最佳答案
根据 Firebase 文档:
此方法用于将此快照中包含的数据编码到您选择的类中。该类必须满足 2 个简单的约束:
- 该类必须有一个不带参数的默认构造函数
- 该类必须为要分配的属性定义公共(public) getter。当实例被反序列化时,没有公共(public) getter 的属性将被设置为其默认值
您还需要命名您的字段和 getter,以便它们与 JSON 属性名称相匹配。
所以你应该有这样的东西:
private String source, target;
public String getSource() { return source; }
public String getTarget() { return target; }
关于android - RecyclerView 不从 Firebase Datasnapshot 检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46507393/