簡體   English   中英

嘗試從Firebase獲取密鑰,而不是獲取奇怪的路徑

[英]Trying to get key from firebase, instead getting a weird path

我有這樣的數據庫結構:

"users": {
   "school": {
      userId (randomkey) {
         "email": "email@emai.email"
         "provider": "provider"
      }
   }
}

我正在使用一個回收者視圖,用戶可以在其中將彼此添加到組中。 我在“回收者”視圖中顯示給用戶的電子郵件,效果很好。 但是問題是我需要檢索所單擊電子郵件的userId密鑰,並將其附加到列表中,然后將其推送到firebase。 我正在用這段代碼來做所有的事情。

轉接器類別

    class RecyclerViewHolder extends RecyclerView.ViewHolder implements  View.OnClickListener {

    private ItemClickListenerPeopleToAdd itemClickListenerPeopleToAdd;
    public TextView emailLbl;

    public RecyclerViewHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
        emailLbl = (TextView) itemView.findViewById(R.id.emailLbl);
    }

    public void setItemClickListenerPeopleToAdd(ItemClickListenerPeopleToAdd itemClickListenerPeopleToAdd) {
        this.itemClickListenerPeopleToAdd = itemClickListenerPeopleToAdd;
    }

    @Override
    public void onClick(View v) {

        itemClickListenerPeopleToAdd.onClick(v, getAdapterPosition());
    }
}

public class PeopleToAddAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {
    private static final String TAG = "Working";
    public ArrayList<String> peopleList = new ArrayList<String>();
    private List<ModelProject> mModelList;

    public PeopleToAddAdapter(List<ModelProject> modelList) {
        mModelList = modelList;
    }

    private Context context;
    private List<PeopleToAdd> mPeopleToAdd;
    public List<PeopleToAdd> mList;


    public PeopleToAddAdapter(Context con, List<PeopleToAdd> list) {
        this.context = con;
        this.mPeopleToAdd = list;
    }

    @NonNull
    @Override
    public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.people_to_add_listview, parent, false);

        return new RecyclerViewHolder(v);
    }

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

        final PeopleToAdd listItem = mPeopleToAdd.get(position);
        holder.emailLbl.setText(listItem.getEmail());
        holder.setItemClickListenerPeopleToAdd(new ItemClickListenerPeopleToAdd() {
            @Override
            public void onClick(View view, int position) {
                Toast.makeText(context, "Click" + listItem.getEmail(), Toast.LENGTH_SHORT).show();
                peopleList.add(listItem.toString());
                Log.d("value", String.valueOf(peopleList));
            }
        });
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView emailLbl;

        public MyViewHolder(View itemView) {
            super(itemView);
            emailLbl = (TextView) itemView.findViewById(R.id.emailLbl);
        }
    }
}

PeopleToAdd

public class PeopleToAdd {
private String email;
private String provider;

public PeopleToAdd(String email, String provider) {
    this.email = email;
    this.provider = provider;
}

public PeopleToAdd() {

}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getProvider() {
    return provider;
}

public void setProvider(String provider) {
    this.provider = provider;
}

}

活動課

listItems = new ArrayList<>();
    schoolList = new ArrayList<>();

    adapter = new PeopleToAddAdapter(this, listItems);
    recyclerView.setAdapter(adapter);

    mGetSchool = mDatabase.getReference().child("users").child(mCurrentUserId).child("schoolName");

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

    mGetSchool.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            childPath = dataSnapshot.getValue(String.class);
            //peopleAddedTxtView.setText(childPath);
            mPeopleToAdd = mDatabase.getReference().child("users").child(childPath);

            mPeopleToAdd.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                    PeopleToAdd peopleToAdd = dataSnapshot.getValue(PeopleToAdd.class);
                    listItems.add(peopleToAdd);

                    test = dataSnapshot.getKey();
                    Log.d(TAG, test);
                    peopleToAddAdapter = new PeopleToAddAdapter(SetProject.this, listItems);
                    recyclerView.setAdapter(peopleToAddAdapter);
                    peopleToAddAdapter.notifyDataSetChanged();
                }

                @Override
                public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                }

                @Override
                public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

                }

                @Override
                public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                }

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

                }
            });
        }

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

        }
    });
}

我以某種方式獲得了一個奇怪的路徑作為userID示例:“ com.appName.Services.PeopleToAdd@ca8f01”。 如何獲得正確的userId(firebase生成的隨機密鑰)。 我將它放在活動的“測試”字符串中,但是當用戶在reyclerView中單擊該用戶時,如何將其添加到列表中。 我希望你能理解我。 先感謝您。

快照包含兩個主要內容:從中加載數據的密鑰和已加載的值。 現在,您的onChildAdded僅使用該值,並丟棄鍵:

public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

    PeopleToAdd peopleToAdd = dataSnapshot.getValue(PeopleToAdd.class);
    listItems.add(peopleToAdd);

    test = dataSnapshot.getKey();
    Log.d(TAG, test);
    peopleToAddAdapter = new PeopleToAddAdapter(SetProject.this, listItems);
    recyclerView.setAdapter(peopleToAddAdapter);
    peopleToAddAdapter.notifyDataSetChanged();
}

而且由於您稍后在代碼中需要密鑰,因此無法再檢索它。 該值不包含鍵。

一種解決方案是將密鑰添加到PeopleToAdd類。 根據我給出的答案, 有沒有辦法將Key存儲在從Firebase對象強制轉換的類中? ,對您來說可能像這樣:

public class PeopleToAdd {
    @Exclude
    public String key;

    private String email;
    private String provider;

    public PeopleToAdd(String email, String provider) {
        this.email = email;
        this.provider = provider;
    }

    public PeopleToAdd() {

    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getProvider() {
        return provider;
    }

    public void setProvider(String provider) {
        this.provider = provider;
    }
}

然后修改您的onChildAdded以設置從值實例化的PeopleToAdd上的鍵:

public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

    PeopleToAdd peopleToAdd = dataSnapshot.getValue(PeopleToAdd.class);

    peopleToAdd.key = dataSnapshot.getKey();

    listItems.add(peopleToAdd);

    peopleToAddAdapter = new PeopleToAddAdapter(SetProject.this, listItems);
    recyclerView.setAdapter(peopleToAddAdapter);
    peopleToAddAdapter.notifyDataSetChanged();
}

現在,您可以從其key字段獲取PeopleToAddkey

暫無
暫無

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

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