#java #android #firebase #google-cloud-firestore
#java #Android #firebase #google-облако-firestore
Вопрос:
Я пытаюсь сделать так, чтобы, когда пользователь нажимает на запись из RecyclerView
, я мог получить идентификатор записи. Я следую видео CodinginFlows о том, как это сделать, но когда я добираюсь до getSnapshot()
, у меня нет возможности его использовать.
Я просмотрел документы, и там говорится, что интерфейс устарел, я не уверен, относится ли это ко всему этому или только к чему-то конкретному.
Я использую Cloud Firestore правильно ли я поступаю или я ошибаюсь?
фрагмент
@SuppressLint("ResourceType")
public ViewHolder(final View itemView) {
super(itemView);
mView = itemView;
parentLayout = itemView.findViewById(R.id.Main_Blog_Post);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = getAdapterPosition();
String id = documentSnapshot.getId();
DocumentReference docRef = db.collection("Posts").document(id);
String postID = docRef.toString();
Toast.makeText(mContext,postID,Toast.LENGTH_SHORT).show();
if (position != RecyclerView.NO_POSITION amp;amp; listner != null){
listner.onItemClick(get);
}
}
});
}
Полный код, если необходимо
public class BlogRecyclerAdapter extends RecyclerView.Adapter<BlogRecyclerAdapter.ViewHolder> {
private OnItemClickListner listner;
public List<BlogPost> blog_list;
private FirebaseFirestore firebaseFirestore;
private FirebaseDatabase firebaseDatabase;
private FirebaseFirestore db = FirebaseFirestore.getInstance();
private DatabaseReference mUserDatabase;
private FirebaseUser mCurrentUser;
private Context mContext;
public BlogRecyclerAdapter(Context context, List<BlogPost> blog_list) {
mContext = context;
this.blog_list = blog_list;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.blog_list_item, parent, false);
firebaseFirestore = FirebaseFirestore.getInstance();
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
CollectionReference mUsersDB = db.collection("Posts");
String desc_data = blog_list.get(position).getDesc();
holder.setDescText(desc_data);
String image_url = blog_list.get(position).getImage_url();
holder.setBlogImage(image_url);
long millisecond = blog_list.get(position).getTimestamp().getTime();
String dateString = DateFormat.format("MM/dd/yyyy", new Date(millisecond)).toString();
holder.setTime(dateString);
holder.parentLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext, Confirmation_Activity.class);
mContext.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return blog_list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public Context mContext;
ConstraintLayout parentLayout;
private View mView;
private TextView descView;
private ImageView blogPostView;
private TextView blogDate;
private TextView blogUserName;
private CircleImageView blogUserImage;
private StorageReference mImageStorage;
private DocumentSnapshot documentSnapshot;
@SuppressLint("ResourceType")
public ViewHolder(final View itemView) {
super(itemView);
mView = itemView;
parentLayout = itemView.findViewById(R.id.Main_Blog_Post);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = getAdapterPosition();
String id = documentSnapshot.getId();
DocumentReference docRef = db.collection("Posts").document(id);
String postID = docRef.toString();
Toast.makeText(mContext,postID,Toast.LENGTH_SHORT).show();
if (position != RecyclerView.NO_POSITION amp;amp; listner != null){
listner.onItemClick(get);
}
}
});
}
public void setDescText(String descText) {
descView = mView.findViewById(R.id.blog_desc);
descView.setText(descText);
}
public void setUserData(String downloadUrl, String name) {
mImageStorage = FirebaseStorage.getInstance().getReference();
mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
final String current_uid = mCurrentUser.getUid();
mUserDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(current_uid);
mUserDatabase.keepSynced(true);
mUserDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String name = Objects.requireNonNull(dataSnapshot.child("name").getValue()).toString();
StorageReference filepath = mImageStorage.child("profile_images").child(current_uid (".jpeg"));
Log.d("heere", "S");
// This gets the download url async
filepath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
//The download url
final String downloadUrl =
uri.toString();
Log.d("tag", downloadUrl);
if (!downloadUrl.equals("default")) {
// Glide.with(getApplicationContext()).load(downloadUrl).into(mDisplayImage);
Glide.with(itemView.getContext()).load(downloadUrl).into(blogUserImage);
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Toast.makeText(getApplicationContext(), "Something went wrong", Toast.LENGTH_SHORT).show();
}
});
//Toast.makeText(getApplicationContext(), image, Toast.LENGTH_SHORT).show();
Log.d("value", dataSnapshot.getValue().toString());
Log.d("key", dataSnapshot.getKey());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
public void setTime(String date) {
blogDate = mView.findViewById(R.id.blog_date);
blogDate.setText(date);
}
public void setBlogImage(final String downloadUri) {
blogPostView = mView.findViewById(R.id.blog_image);
Glide.with(itemView.getContext()).load(downloadUri).into(blogPostView);
}
}
public interface OnItemClickListner{
void onItemClick(DocumentSnapshot documentSnapshot, int position);
}
public void setOnItemClickListner(OnItemClickListner listner){
this.listner = listner;
}
}
Комментарии:
1. Вы пытаетесь получить идентификатор DocumentReference?
2. Я пытаюсь получить идентификатор документа, поскольку он хранится в firebase, проверьте прикрепленное изображение
Ответ №1:
Хотя вы не очень знакомы с устаревшим getSnapshot()
методом, вы можете получить идентификатор ссылки на документ, добавив его в качестве поля при первоначальном добавлении записи в базу данных.
например
DocumentReference documentReference = firebaseFirestore.collection("Posts").document();//generate the random blog_id here
Map<String, Object> postMap = new HashMap<>(); //hashmap do add files to your db
postMap.put("image_url", image);
postMap.put("desc", companyName);
postMap.put("blog_id", documentReference.getId());
//add the rest of the document here
documentReference.set(postMap).addOnCompleteListener....
documentReference.getId()
получит ваш идентификатор блога в виде строки, и вы добавите его в базу данных с ключом blog_id
Затем вам нужно будет обновить класс модели BlogPost, чтобы переменная blog_id была такой же, как у вас уже есть, или URL описания и изображения.
Затем внутри вашего адаптера recycler внутри onBindViewHolder
String blog_id = blog_list.get(position).getBlog_id();
Теперь у вас есть blog_id в строке, и вы можете передать его куда угодно.
Комментарии:
1. Спасибо за ответ, я просто хочу убедиться, что это сработает с моей проблемой. Моя текущая ситуация заключается в том, что когда пользователь создает сообщение, он добавляет документ post в свою уважаемую коллекцию, затем добавляет новый документ в другую коллекцию с тем ЖЕ идентификатором, что и post этот новый документ позволяет пользователям отправлять сообщения друг другу. итак, мой план заключается в том, что когда пользователь нажимает на сообщение, он получает идентификатор записи, а затем я передаю это в переменную, а затем использую это для извлечения идентификатора документа сообщений, если это сбивает с толку, дайте мне знать
2. Это не сбивает с толку. Если я правильно понимаю, вы хотите, чтобы два документа по существу имели одинаковое имя. В данном случае идентификаторы. postID и MessageId под одним и тем же именем (id). Тогда это то, что вы ищете. Создайте имя записи с автоматически созданным идентификатором записи. Создайте сообщение > назовите его идентификатором записи, который был сгенерирован ранее. Правильно?
3. да, у меня уже есть два создаваемых документа, так что это сделано, я просто не могу понять, как получить идентификатор, когда пользователь нажимает на сообщение, потому что есть несколько сообщений от разных пользователей, я не могу просто сохранить переменную при первоначальном создании сообщения
4. почему вы не можете сохранить переменную при первоначальном создании записи? Я только что привел вам пример, который делает именно это и упрощает определение того, на какую запись нажал пользователь.
5. Извините, если я неправильно понял ваш пост, я думал, что не смогу сохранить исходный идентификатор записи в качестве переменной, потому что, если пользователь A создаст запись, а затем сохранит этот идентификатор в переменной, когда пользователь B придет и выберет запись, он не будет сохранен. потому что они не создавали post
Ответ №2:
Почему вы говорите, что getSnapshot()
метод устарел, потому что это не так, Snapshots.OpenSnapshotResult
интерфейс является. Чтобы иметь возможность получить идентификатор документа, который вы ищете, ваш класс адаптера должен расширять FirestoreRecyclerAdapter
class. Итак, в этом случае, чтобы получить идентификатор документа, вы, безусловно, можете использовать getSnapshots()
метод, подобный приведенным в следующих строках кода:
@Override
protected void onBindViewHolder(@NonNull ProductViewHolder holder, int position, @NonNull YourModelClass yourModelClass) {
String id = getSnapshots().getSnapshot(position).getId();
}