Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当用户选择某个项目时,如何在recyclerview中获取该项目的ID_Android_Firebase_Android Recyclerview_Google Cloud Firestore - Fatal编程技术网

Android 当用户选择某个项目时,如何在recyclerview中获取该项目的ID

Android 当用户选择某个项目时,如何在recyclerview中获取该项目的ID,android,firebase,android-recyclerview,google-cloud-firestore,Android,Firebase,Android Recyclerview,Google Cloud Firestore,这个问题困扰了我很长一段时间,我已经失去了想法。我有一个recyclerview设置,我需要它,这样当用户点击recyclerview(post)中的项目时,它可以从firebase获取该帖子的文档id,并将其显示在toast中或存储在变量中 我试图使用Firestore UI重写适配器,但我无法让它与我拥有的一些额外代码一起工作,因此我将其还原 适配器 public class BlogRecyclerAdapter extends RecyclerView.Adapter<BlogRe

这个问题困扰了我很长一段时间,我已经失去了想法。我有一个recyclerview设置,我需要它,这样当用户点击recyclerview(post)中的项目时,它可以从firebase获取该帖子的文档id,并将其显示在toast中或存储在变量中

我试图使用Firestore UI重写适配器,但我无法让它与我拥有的一些额外代码一起工作,因此我将其还原

适配器

public class BlogRecyclerAdapter extends RecyclerView.Adapter<BlogRecyclerAdapter.ViewHolder> {

public List<BlogPost> blog_list;

private FirebaseFirestore firebaseFirestore;
private FirebaseDatabase firebaseDatabase;

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) {

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

    //  String user_data = blog_list.get(position).getUser_id();
    //  holder.setUserData(user_data);




    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;

    @SuppressLint("ResourceType")
    public ViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
        parentLayout = itemView.findViewById(R.id.Main_Blog_Post);

    }

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


    }



}
        holder.parentLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            int pos = holder.getAdapterPosition();

            String id = blog_list.get(pos).getPost_id();

            Toast.makeText(mContext, "test" + id, Toast.LENGTH_LONG).show();

            Intent intent = new Intent(mContext, Confirmation_Activity.class);
            mContext.startActivity(intent);
        }
    });
}

此外,不能将集合硬编码到适配器中,因为我有多个用于帖子的集合,如果这是一个问题的话

我现在在哪里

BlogPost

    public String getPost_id() {
    return post_id;
}
//not being used??
public void setPost_id(String post_id) {
    this.post_id = post_id;
}
添加了getter和setter

BlogRecyclerAdapter

public class BlogRecyclerAdapter extends RecyclerView.Adapter<BlogRecyclerAdapter.ViewHolder> {

public List<BlogPost> blog_list;

private FirebaseFirestore firebaseFirestore;
private FirebaseDatabase firebaseDatabase;

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) {

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

    //  String user_data = blog_list.get(position).getUser_id();
    //  holder.setUserData(user_data);




    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;

    @SuppressLint("ResourceType")
    public ViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
        parentLayout = itemView.findViewById(R.id.Main_Blog_Post);

    }

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


    }



}
        holder.parentLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            int pos = holder.getAdapterPosition();

            String id = blog_list.get(pos).getPost_id();

            Toast.makeText(mContext, "test" + id, Toast.LENGTH_LONG).show();

            Intent intent = new Intent(mContext, Confirmation_Activity.class);
            mContext.startActivity(intent);
        }
    });
当我运行应用程序并点击一个项目时,toast会显示testnull,这是因为我没有将id存储为文档中的值吗

(这些是我对应用程序所做的唯一更改)

db结构


我相信您的POJO
BlogPost
有一个名为post\u id的字段集

因此,这是一项简单的任务,在
onBindViewHolder
中,当您执行项目单击时,您可以使用该方法提供的位置访问所单击项目的所有属性,您可以这样做

holder.parentLayout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        String id = blog_list.get(position).getPostID(); //this will be your desired id              
         //here you can do whatever you want whith this id, pass it to the next activity and perform the request will be the better option.

        Intent intent = new Intent(mContext, Confirmation_Activity.class);
        mContext.startActivity(intent);
    }
});

嘿,谢谢你的回复,我没有所谓的post_id,我也有点不确定你指的是什么,你是说在我的Blogpost.java类中,我应该为post_id设置一个getter和setter吗?添加blogpost.javaYes thant这就是我的意思,在你的模型类中,添加id,当你检索帖子时,获取id,让它工作,如果数据库配置错误,我现在将它存储在一个变量中,我将使用一个接口将它传递出该类