【问题标题】:How to input a string into a ViewHolder如何将字符串输入到 ViewHolder
【发布时间】:2023-03-23 01:36:01
【问题描述】:

我想将来自不同类的字符串放入以下代码:

 public class FirebaseCommentViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private View mView;
        private Context mContext;
        private String mphotoUserID;
        private String mUrl;


        public FirebaseCommentViewHolder(View itemView) {
            super(itemView);
            mView = itemView;
            mContext = itemView.getContext();

            itemView.setOnClickListener(this);
        }

        public void bindComment(final Comment comment) {
            TextView usernameTextView = (TextView) mView.findViewById(R.id.comment_username);
            TextView comment_textview = (TextView) mView.findViewById(R.id.comment_textview);
            ImageButton moreOptionsImageButton = (ImageButton) mView.findViewById(R.id.comment_more_options);


            mphotoUserID = comment.getCommenter();
            mUrl = PhotoUtilities.removeWebPFromUrl(comment.getPhoto_url());

            //usernameTextView.setText(comment.getCommenter());
            setCommentorsName(comment.getCommenter(), usernameTextView);
            comment_textview.setText(comment.getCommentString());
}

        public void setCommentorsName(String uid, final TextView usernameTextView) {
            FirebaseDatabase.getInstance().getReference(FirebaseConstants.USERDATA).child(uid).child(FirebaseConstants.USERNAME)
                    .addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if (dataSnapshot.getValue() != null) {
                                usernameTextView.setText(dataSnapshot.getValue().toString());

                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            usernameTextView.setText("BOB");
                        }
                    });
        }

        @Override
        public void onClick(View view) {
            final ArrayList<Comment> comments = new ArrayList<>();
    //      Reference correct section of database below
            Toast.makeText(mContext, "Item Clicked", Toast.LENGTH_SHORT).show();
            DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child(FirebaseConstants.PHOTOS)
                    .child(mUrl).child(FirebaseConstants.COMMENTS);
            ref.addListenerForSingleValueEvent(new ValueEventListener() {
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                        comments.add(snapshot.getValue(Comment.class));
                    }

    //                int itemPosition = getLayoutPosition();

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

                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });

        }

以下是我用来启动课程的代码:

private void setUpFirebaseAdapter() {
    mFirebaseAdapter = new FirebaseRecyclerAdapter<Comment, FirebaseCommentViewHolder>
            (Comment.class, R.layout.comment_template, FirebaseCommentViewHolder.class,
                    mCommentReference) {

        @Override
        protected void populateViewHolder(FirebaseCommentViewHolder viewHolder,
                                          Comment model, int position) {
            viewHolder.bindComment(model);
        }
    };
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    mRecyclerView.setAdapter(mFirebaseAdapter);
    mRecyclerView.setVisibility(View.VISIBLE);
}

基本上,我需要将代码中的用户 ID 传递到 FirebaseCommentViewHolder 类中,但我不确定是如何实现的,因为我以前从未实现过这样的代码。我试图将它添加到构造函数中,但这不起作用/得到 Android Studio 的认可。任何其他提示将不胜感激!

注意:我确实删除了一些不相关的代码,所以如果括号不匹配或其他原因。

【问题讨论】:

  • 什么不同的类?放在哪里?
  • 只要输入你注释掉的usernameTextView.setText的id
  • usernameTextView.setText(dataSnapshot.getValue().toString()) 的值是多少?是来自 Firebase 的 JSON 吗?
  • 我已经有了。我想获取当前用户。这样我可以检查当前用户是否是留下评论的人,以便当前用户可以选择删除或编辑评论。其他用户将没有该选项。
  • 没关系,我知道这对 viewholder 来说是个问题,因为它确实为每个视图创建了一个新的 viewholder。所以,我不妨把它放到bindComment()中。谢谢!

标签: android firebase firebase-realtime-database android-recyclerview firebaseui


【解决方案1】:

基本上我需要将代码中的用户 ID 传递到 FirebaseCommentViewHolder 类中

我只是添加一个参数

    @Override
    protected void populateViewHolder(FirebaseCommentViewHolder viewHolder,
             Comment model, int position) {
        // Grab your userId from somewhere
        viewHolder.bindComment(model, userId);
    }

您无法添加到 ViewHolder 的构造函数中,因为 FirebaseUI 正在将其从您的代码中抽象出来。

您也可以扩展 FirebaseRecyclerAdapter 并将其添加到 that 构造函数中

private void setUpFirebaseAdapter(final String userId) {
    // For example
    mFirebaseAdapter = new UserIdFirebaseRecyclerAdapter<Comment, FirebaseCommentViewHolder>
            (userId, Comment.class, R.layout.comment_template, FirebaseCommentViewHolder.class,
                    mCommentReference) {

无论哪种方式,您都可以通过 bindComment() 方法将其放入 ViewHolder。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多