android - RecyclerView 不从 Firebase Datasnapshot 检索数据

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

我正在尝试从 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>

`

enter image description here

enter image description here

最佳答案

根据 Firebase 文档:

此方法用于将此快照中包含的数据编码到您选择的类中。该类必须满足 2 个简单的约束:

  1. 该类必须有一个不带参数的默认构造函数
  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/

相关文章:

iphone - 无法在 objective-c 的表中插入记录

javascript - 从子进程执行node.js中的代码

database - 如何在 SaaS 环境中处理过期的免费帐户

android - 如何将数据从数据库传输到某个业务实体

angularjs - Angular 火集合 : know when the data is fully loaded

firebase - Firestore 安全规则 : understanding match/databases/{database}/documents

java - ViewPager fragment 中的 ListView 为空白

java - 使用 match_parent 为什么文本位于右侧 View 下方?

java - 如何让android中的选取框重复一次

Android google now 卡片文本颜色代码