2

FirebaseからrecyclerViewを取り込もうとしています。アイテムをデータベースに追加すると、最終的にはrecyclerViewもうまく動作します(コンソールから見ることも、Androidのモニターのタグから見ることもできます)。 RVが読み込まれ、listItemsの内部に、テキストをデータベースから取得する2つのTextViewがあります。RecyclerViewはFirebase Datasnapshotからデータを取得しません。

私の問題は、これら2つのtextViewが表示されないということです。私は多くの研究を行い、私の問題は脱直列化だと思う。

ここから私は、フラグメントを通じてアイテムを追加している:

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

     } 
    }); 

} 

に位置していますし、ここに私のObjectクラスは

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. をとらないデフォルトコンストラクタを持っている必要があります。パブリックゲッターを使用しないプロパティは、インスタンスが逆シリアル化されたときにデフォルト値に設定されます。

JSONプロパティ名と一致するようにフィールドとゲッターの名前を付ける必要があります。

だからあなたのようなものが必要です:

private String source, target; 

    public String getSource() { return source; } 

    public String getTarget() { return target; } 
0

は、それが少なくとも一度

+0

ねえ、それは動作しませんでしたしてみてくださいwork.Justよかもしれadapter.notifyDataSetChange後のデータのロード中にrecyclerView.setAdapter(adapter);を追加しよう。ニックアレンは答えを持っています。とにかく、ありがとう。 – Sruda

関連する問題