2

我試圖從Firebase填充recyclerView。添加項目到數據庫,並最終recyclerView工作正常(我可以通過控制檯,也通過Android監視器上的標籤看到它)。 RV得到填充,並在listItems裏面我有兩個TextViews應該從數據庫中檢索他們的文本。RecyclerView不從Firebase Datasnapshot檢索數據

我的問題是,這兩個textViews不出現。我做了大量的研究,我認爲我的問題是反序列化。

從這裏,我通過一個片段添加一個項目:

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(); 
      } 
     } 
    }); 

} 

這裏是我的活動,其中RV位於

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適配器

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" 
    } 


} 

} 

} 

清單:`

<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

回答

1

根據Firebase文檔:

此方法用於將此快照中包含的數據封裝到您選擇的類中。這個類必須滿足2層簡單的約束:

  1. 的類必須有一個默認的構造函數,它沒有參數
  2. 類必須定義一個公共的getter爲要分配的屬性。當一個實例被反序列化時,沒有公共getter的屬性將被設置爲其默認值

您還需要命名您的字段和getter,以便它們匹配JSON屬性名稱。

所以,你應該是這樣的:

private String source, target; 

    public String getSource() { return source; } 

    public String getTarget() { return target; } 
0

嘗試在加載數據adapter.notifyDataSetChange之後添加recyclerView.setAdapter(adapter);可能它會work.Just至少嘗試一次

+0

嘿,它沒有工作。 Nick Allen有答案。不管怎麼說,多謝拉。 – Sruda