0

ich eine App entwickle, die mir Referenz von zwei Firebase Datenbank Referenzen in einer cardview erhalten erfordert. Unten ist das Modell des cardviewErste Werte aus mehrere Firebase Datenbank Referenzen in einem cardView

<?xml version="1.0" encoding="utf-8"?> 

<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="20dp" 
    android:layout_marginRight="35dp" 
    android:layout_marginLeft="35dp" 
    android:layout_marginBottom="60dp"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="75dp" 
     > 
     <ImageView 
      android:layout_width="0dp" 
      android:layout_weight="1" 
      android:layout_height="match_parent" 
      android:layout_marginBottom="5dp" 
      android:layout_marginTop="5dp" 
      android:layout_marginLeft="5dp" 
      app:srcCompat="@drawable/action_setup" 
      android:id="@+id/dPicture"/> 
     <TextView 
      android:text="Username" 
      android:layout_width="0dp" 
      android:layout_weight="4" 
      android:layout_height="match_parent" 
      android:gravity="center_vertical" 
      android:id="@+id/posted_username" 
      android:paddingLeft="15dp"/> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:elevation="10dp"> 


     <ImageView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/posted_image" 
      android:scaleType="centerCrop" 
      android:adjustViewBounds="true" 
      android:src="@color/Orange" 
      /> 

     <TextView 
      android:text="Post Title..." 
      android:padding="15dp" 
      android:textSize="16dp" 
      android:textStyle="bold" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/posted_title"/> 

     <TextView 
      android:text="Summary..." 
      android:paddingLeft="15dp" 
      android:paddingRight="15dp" 
      android:paddingBottom="15dp" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:maxLength="300" 
      android:maxLines="5" 
      android:id="@+id/posted_sharing"/> 



    </LinearLayout> 

</LinearLayout> 
</android.support.v7.widget.CardView> 

und das ist, wie die Datenbank wie

in Firebase suchen
{ 
    "Users" : { 
    "1" : { 
     "image" : "http://something.com/something", 
     "name" : "person 1" 
    }, 
    "2" : { 
     "image" : "http://someone.com/someone", 
     "name" : "person 2" 
    } 
    }, 
    "posts" : { 
    "post 1" : { 
     "content" : "test content 1", 
     "dPicture" : "http://something.com/something", 
     "picture" : "http://postimage.com/postimage", 
     "title" : "test title 1", 
     "uid" : 1, 
     "username" : "person 1" 
    }, 
    "post 2" : { 
     "content" : "test content 2", 
     "dPicture" : "http://someone.com/someone", 
     "picture" : "http://postimage2.com/postimage2", 
     "title" : "test title 2", 
     "uid" : 2, 
     "username" : "person 2" 
    } 
    } 
} 

und die Aktivität Code ist

public class MainActivity extends AppCompatActivity { 

    private RecyclerView mPostedList; 
    private LinearLayoutManager mLayoutManager; 
    private DatabaseReference mDatabaseSharings; 
    private FirebaseAuth mAuth; 
    private FirebaseUser mCurrentUser; 
    private FirebaseAuth.AuthStateListener mAuthListener; 
    private DatabaseReference mDatabaseUsers; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     mAuth = FirebaseAuth.getInstance(); 
     mDatabaseSharings = FirebaseDatabase.getInstance().getReference().child("posts"); 
     mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users"); 
     mCurrentUser = mAuth.getCurrentUser(); 
     mDatabaseSharings.keepSynced(true); 

final String uid = mCurrentUser.getUid(); 


     //bring user to login activity when auth-state is null 

     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       if (firebaseAuth.getCurrentUser() == null) { 
        Intent loginIntent = new Intent(MainActivity.this, LoginActivity.class); 
        loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(loginIntent); 
       } 
      } 
     }; 




//keep users logged in 
     mDatabaseUsers.keepSynced(true); 

     mPostedList = (RecyclerView) findViewById(R.id.posted_list); 
     mPostedList.setHasFixedSize(true); 
     mPostedList.setLayoutManager(new LinearLayoutManager(this)); 

    } 


    @Override 
    protected void onStart() { 
     super.onStart(); 


     mAuth.addAuthStateListener(mAuthListener); 

     //your adapter 
     FirebaseRecyclerAdapter<PostedModel, PostedModelViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<PostedModel, PostedModelViewHolder>(

       PostedModel.class, R.layout.posted_row, PostedModelViewHolder.class, mDatabaseSharings 
     ) { 
      @Override 
      protected void populateViewHolder(PostedModelViewHolder viewHolder, PostedModel model, int position) { 


         viewHolder.setTitle(model.getTitle()); 
         viewHolder.setDPicture(getApplicationContext(), model.getDPicture()); 
         viewHolder.setSummary(model.getSummary()); 
         viewHolder.setImage(getApplicationContext(), model.getImage()); 
         viewHolder.setUsername(model.getUsername()); 


       final String post_key = getRef(position).getKey(); 





       viewHolder.mView.setOnLongClickListener(new View.OnLongClickListener() { 
        @Override 
        public boolean onLongClick(View view) { 

         Intent delete_intent = new Intent(MainActivity.this, DeleteActivity.class); 
         delete_intent.putExtra("blog_id", post_key); 
         startActivity(delete_intent); 
         return false; 
        } 
       }); 
       viewHolder.mView.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 

         Intent comment_intent = new Intent (MainActivity.this, CommentActivity.class); 
         comment_intent.putExtra("blog_id", post_key); 
         startActivity(comment_intent); 
        } 
       }); 


      } 
     }; 
     mPostedList.setAdapter(firebaseRecyclerAdapter); 
     mLayoutManager = new LinearLayoutManager(MainActivity.this); 
     mLayoutManager.setReverseLayout(true); 
     mLayoutManager.setStackFromEnd(true); 
     mPostedList.setLayoutManager(mLayoutManager); 


    } 

    public static class PostedModelViewHolder extends RecyclerView.ViewHolder{ 



     View mView; 

     public PostedModelViewHolder(View itemView) { 
      super(itemView); 





      mView = itemView; 
     } 

     public void setTitle(String title){ 


    TextView post_title = (TextView)mView.findViewById(R.id.posted_title); 
      post_title.setText(title); 
     } 
     public void setDPicture(Context ctx, String dPicture){ 

      ImageView post_dPicture = (ImageView) mView.findViewById(R.id.dPicture); 
      Picasso.with(ctx).load(dPicture).into(post_dPicture); 
     } 


     public void setSummary (String summary){ 

      TextView post_summary = (TextView)mView.findViewById(R.id.posted_sharing); 
      post_summary.setText(summary); 
     } 
     public void setImage(Context ctx, String image){ 
      ImageView post_image = (ImageView) mView.findViewById(R.id.posted_image); 
      Picasso.with(ctx).load(image).into(post_image); 


     } 
     public void setUsername (String username){ 
      TextView post_username = (TextView)mView.findViewById(R.id.posted_username); 
      post_username.setText(username); 
     } 

    } 


} 

Natürlich gibt es die PostedModel ist. die Klasse ist die Getter und Setter-Klasse für sie

public class PostedModel { 
    private String title; 
    private String summary; 
    private String image; 
    private String dPicture; 


    private String username; 

    public PostedModel(){} 

    public PostedModel(String title, String summary, String image) { 
     this.title = title; 
     this.summary = summary; 
     this.image = image; 
     this.dPicture = dPicture; 
     this.username = username; 
    } 
    public String getDPicture() { 
     return dPicture; 
    } 

    public void setDPicture(String dPicture) {this.dPicture = dPicture;} 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) {this.title = title;} 

    public String getSummary() { 
     return summary; 
    } 

    public void setSummary(String summary) { 
     this.summary = summary; 
    } 

    public String getImage() { 
     return image; 
    } 

    public void setImage(String image) { 
     this.image = image; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

} 

Nun, wie Sie sehen können, habe ich eine Posting-Aktivität, die sowohl den Benutzernamen als auch den Bildwert aus der „Benutzer“ Datenbank in die „Beiträge“ Datenbank Kind (dPicture) übergeben. Wenn jedoch ein Benutzer seinen Benutzernamen aktualisiert, werden nur die Werte aus der Datenbank "Benutzer" geändert und nicht von vorhandenen "Posts".

Ich denke, der effizienteste Weg besteht darin, den Viewholder mit Daten zu füllen die beiden Datenbankreferenzen, verbinden beide mit der eindeutigen ID des Benutzers, der Schlüssel in der "Benutzer" -Datenbank und als Kind (uid) in der "Posts" -Datenbank, aber ich weiß nicht, wie es geht ... Ich füge an eine Momentaufnahme der Datenbank Screenshot mit Boxen für den Fall zu illustrieren ich bin verwirrend Menschen mit meiner subpar Fachsprache

here

das Ziel ist also die roten Box-Daten zu erhalten und gepaart wi th grüne boxed Daten.

Vielen Dank für alles hilft vorher!

Edit: Ich weiß nicht, ob ich damit auf dem richtigen Weg bin ... Also ich denke, den richtigen Weg, es wird mit einem valueEventListener für die Datenbank zu tun, nachdem die Nachforschungen, die ich will Daten erhalten aus dem Inneren der Adapterklasse ...

Bisher habe ich diese

FirebaseRecyclerAdapter<PostedModel, PostedModelViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<PostedModel, PostedModelViewHolder>(

       PostedModel.class, R.layout.posted_row, PostedModelViewHolder.class, mDatabaseSharings 
     ) { 
      //calling the value from the Summary.java class 
      @Override 
      protected void populateViewHolder(final PostedModelViewHolder viewHolder, final PostedModel model, final int position) { 
mDatabaseUsers.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if(dataSnapshot.getKey().toString() == mDatabaseSharings.child("uid").toString()){ 
     viewHolder.setUsername(model.getUsername()); 
     viewHolder.setDPicture(getApplicationContext(), model.getDPicture()); 
    } 

     viewHolder.setTitle(model.getTitle()); 
     viewHolder.setSummary(model.getSummary()); 
     viewHolder.setImage(getApplicationContext(), model.getImage()); 

    } 


    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 

}); 

Aber ich der Schlüssel anstelle des Wertes bin immer übergeben haha ​​

Antwort

0

zwei Array-Liste Ausprobieren Erstellen ArrayL sagen ist abc, def. Nachdem Sie die Daten vom Benutzerknoten abgerufen haben, schreiben Sie den Benutzernamen und das Bild wie abc.username. Danach holen Sie Daten vom Posts-Knoten und machen dasselbe für den Rest der Daten. Dann schreibe am Ende der beiden Funktionen def.add (abc); Ich denke, das sollte den Job machen.

+0

hi @Ambuj danke für den Kommentar. Hmmm Ich denke, ich sollte ValueEventListener verwenden, weil das scheint, wie alle anderen es tun ... Ich weiß nur nicht, wie man es richtig implementiert ... – Jagmaster

Verwandte Themen