簡體   English   中英

如何在 LIKE_ID、POST_ID + USER_ID 中放入 Firebase

[英]How to put in Firebase in the LIKE_ID, POST_ID + USER_ID

我遇到了一個我自己無法解決的大問題,我需要在 Firebase 中輸入我的社交網絡應用程序的點贊,id 為 POSTID + USERID,但實際上,我不知道如何帶上 postid 並粘貼在喜歡 id(發布鍵)中。 主要問題是關於 post_key:它給了我一個隨機 id 而不是 post id 但老實說,我不知道如何帶它,所以結果是 LIKESID = RANDOMID + USERID,而不是 LIKESID = POSTID + USERID 我認為對於專家級程序員來說修復它非常簡單,但作為初學者,這讓我大吃一驚

Firebase 結構

   public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    ArrayList<Model> mList;
    Context context;

    public MyAdapter(Context context, ArrayList<Model> mList){
        this.mList = mList;
        this.context = context;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.item , parent , false);
        return new MyViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

      Model model = mList.get(position);
      holder.nickname.setText(model.getNickname());
      holder.date.setText(model.getDate());
      holder.time.setText(model.getTime());
      holder.post.setText(model.getPost());
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder{
        ImageButton like;
        Boolean likechecker = false;
        String currentUserID;
        FirebaseAuth mAuth;
        TextView date, time, nickname, post, liketextview;
        DatabaseReference LikesRef;
        DatabaseReference Database = FirebaseDatabase.getInstance().getReference();
        final String post_key = Database.push().getKey();
        Integer countlikes;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            date = itemView.findViewById(R.id.date_text);
            time = itemView.findViewById(R.id.time_text);
            post = itemView.findViewById(R.id.post_text);
            nickname = itemView.findViewById(R.id.nickname_text);
            like = itemView.findViewById(R.id.like_btn);
            mAuth = FirebaseAuth.getInstance();
            currentUserID = mAuth.getCurrentUser().getUid();
            LikesRef = (FirebaseDatabase.getInstance().getReference().child("Likes"));
            setlikebuttonstatus(post_key);

            like.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                     likechecker = true;

                    LikesRef.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                        if(likechecker.equals(true)){
                            if (snapshot.child(post_key).hasChild(currentUserID)){
                                LikesRef.child(post_key).child(currentUserID).removeValue();
                                likechecker = false;
                            }
                            else {
                                LikesRef.child(post_key).child(currentUserID).setValue(true);
                                likechecker = false;
                            }
                        }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError error) {

                        }
                    });
                }
            });
        }

        public void setlikebuttonstatus(final String post_key) {
            post = itemView.findViewById(R.id.post_text);
            liketextview = itemView.findViewById(R.id.like_textview);
            LikesRef = (FirebaseDatabase.getInstance().getReference().child("Likes"));
            mAuth = FirebaseAuth.getInstance();
            currentUserID = mAuth.getCurrentUser().getUid();

            LikesRef.addValueEventListener(new ValueEventListener() {
              @Override
              public void onDataChange(@NonNull DataSnapshot snapshot) {
                  if(snapshot.child(post_key).hasChild(currentUserID)){
                     countlikes = (int) snapshot.child(post_key).getChildrenCount();
                     like.setImageResource(R.drawable.like);
                     liketextview.setText(Integer.toString(countlikes) + " Likes");}
                 else {
                     countlikes = (int) snapshot.child(post_key).getChildrenCount();
                     like.setImageResource(R.drawable.notlike);
                     liketextview.setText(Integer.toString(countlikes) + " Likes");
                     }

              }

              @Override
              public void onCancelled(@NonNull DatabaseError error) {

              }
          });
        }


    }
}

主頁.Activity

package com.example.scrapbase11;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerAdapter_LifecycleAdapter;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.storage.StorageReference;
import com.squareup.picasso.Picasso;

import java.awt.font.TextAttribute;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.EventListener;
import java.util.HashMap;
import java.util.List;

import de.hdodenhof.circleimageview.CircleImageView;

public class HomepageActivity extends AppCompatActivity {
    String currentUserID;
    private FirebaseAuth mAuth;
    private DatabaseReference UsersRef, PostsRef, LikesRef;
    private TextView nicknamedisplayed, displaynumblikes;
    private EditText posttext;
    private CircleImageView circleImageView;
    private Button pubblicabtn;
    private String saveCurrentdate, saveCurrenttime, tsaveCurrentdate, tsaveCurrenttime, postRandomName, nickname;
    private RecyclerView recyclerView;
    private FirebaseDatabase db = FirebaseDatabase.getInstance();
    private DatabaseReference root = db.getReference().child("Posts");
    private DatabaseReference Database = FirebaseDatabase.getInstance().getReference();
    private MyAdapter adapter;
    private ArrayList<Model> list;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_homepage);

        displaynumblikes = (TextView) findViewById(R.id.like_textview);
         nicknamedisplayed = (TextView) findViewById(R.id.nickname_textview);
        posttext = (EditText) findViewById(R.id.postedittext);
        pubblicabtn = (Button) findViewById(R.id.pubblica_btn);
        circleImageView = (CircleImageView) findViewById(R.id.home_profileimage);
        mAuth = FirebaseAuth.getInstance();
        currentUserID = mAuth.getCurrentUser().getUid();
        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        list = new ArrayList<>();
        adapter = new MyAdapter(this, list);
        recyclerView.setAdapter(adapter);
        Calendar calFordDate = Calendar.getInstance();
        Calendar calFordTime = Calendar.getInstance();
        SimpleDateFormat currentDate = new SimpleDateFormat("dd/MM/yyyy");
        saveCurrentdate = currentDate.format(calFordDate.getTime());
        SimpleDateFormat currentTime = new SimpleDateFormat("HH:mm");
        saveCurrenttime = currentTime.format(calFordTime.getTime());
        final String post_key = Database.push().getKey();

        circleImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Sendtomyprofile();
            }
        });


        nicknamedisplayed.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Sendtomyprofile();
            }
        });
        root.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
             for(DataSnapshot dataSnapshot : snapshot.getChildren()){
                 Model model = dataSnapshot.getValue(Model.class);
                 list.add(model);
             }
             adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });

        UsersRef = (FirebaseDatabase.getInstance().getReference().child("Users"));
        PostsRef = (FirebaseDatabase.getInstance().getReference().child("Posts"));
        LikesRef = (FirebaseDatabase.getInstance().getReference().child("Likes"));

        pubblicabtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Savepostmethod();
            }
        });

        // codice per far visualizzare il proprio nickname

        UsersRef.child(currentUserID).addValueEventListener(new ValueEventListener() {
           @Override
           public void onDataChange(@NonNull DataSnapshot snapshot) {
               if(snapshot.exists()){
                   nickname = snapshot.child("nickname").getValue().toString();

                   nicknamedisplayed.setText("Welcome back " + nickname);
               }
           } 
       // fine del codice per visualizzare il proprio nickname


           @Override
           public void onCancelled(@NonNull DatabaseError error) {
               Toast.makeText(HomepageActivity.this, "Database error :)", Toast.LENGTH_SHORT).show();
           }
       });
    }

    private void Sendtomyprofile() {
        Intent Gotomyprofileintent =new Intent(HomepageActivity.this, ProfileActivity.class);
        startActivity(Gotomyprofileintent);
    }

    private void Savepostmethod() {
        String post = posttext.getText().toString();

        if (TextUtils.isEmpty(post)) {
            Toast.makeText(this, "Please write something...", Toast.LENGTH_SHORT).show();
        } else {
            Calendar tcalFordDate = Calendar.getInstance();
            Calendar tcalFordTime = Calendar.getInstance();

            SimpleDateFormat tcurrentDate = new SimpleDateFormat("ddMMyyyy");
            tsaveCurrentdate = tcurrentDate.format(tcalFordDate.getTime());
            SimpleDateFormat tcurrentTime = new SimpleDateFormat("HHmm");
            tsaveCurrenttime = tcurrentTime.format(tcalFordTime.getTime());

            postRandomName = tsaveCurrentdate + tsaveCurrenttime;
            HashMap postMap = new HashMap();
            postMap.put("userid", currentUserID);
            postMap.put("nickname", nickname);
            postMap.put("post", post);
            postMap.put("time", saveCurrenttime);
            postMap.put("date", saveCurrentdate);
            PostsRef.child(currentUserID + postRandomName).updateChildren(postMap).addOnCompleteListener(new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    if(task.isSuccessful()) {
                        Toast.makeText(HomepageActivity.this, "Pubblicazione riuscita", Toast.LENGTH_SHORT).show();
                    }
                    else
                    {
                        Toast.makeText(HomepageActivity.this, "Pubblicazione non riuscita, controlla la tua connessione internet", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    }}

問題很明顯。 您在這里創建:

final String post_key = Database.push().getKey();

總是一個隨機的 Uid。 並在這里使用它:

setlikebuttonstatus(post_key);

如問題中所述,您總是以 LIKESID = RANDOMID + USERID 結束。 您還編寫了解決方案:寫postUid而不是隨機的。

這里的 model 給你的是什么? 它只是一個字符串嗎?:

holder.post.setText(model.getPost());

您能否與我們分享您如何獲得posts列表,我們可以找到解決方案。 我們基本上只需要每個帖子快照中的key而不是數據。 您可能擁有它,但它沒有映射到您的其他代碼來獲取它。

使用編輯中的代碼,您可以獲得這樣的post uid,並可能添加到Model class 屬性id ,然后像這樣添加它:

Model model = dataSnapshot.getValue(Model.class);
String key=dataSnapshot.getKey();
model.id=key;
list.add(model);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM