【问题标题】:Use different layout for text and image in recyclerview from firebase database?对来自firebase数据库的recyclerview中的文本和图像使用不同的布局?
【发布时间】:2018-10-10 08:20:24
【问题描述】:

我想对 Recyclerview 中仅包含文本和文本 + 图像的数据使用不同的布局。

我创建了两个布局,layout_post 用于纯文本数据,layout_post_with_image 用于文本+图像数据。

到目前为止,我的代码正在 RecycleView 中显示两种不同的布局,但问题是它只在第一个数据中显示 layout_post_with_image,在第二个数据中显示 layout_post,在第三个数据中显示 layout_post_with_image,无论数据我放,布局显示相同的模式。 所以有人可以帮助我吗?

这里是查看器

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.myapp.R;
import java.awt.font.TextAttribute;

public class PostViewHolder extends RecyclerView.ViewHolder {
public TextView textPost;
public TextView textTime;
public ImageView postImage;

public PostViewHolder(View itemView){
    super(itemView);
    textPost = (TextView) itemView.findViewById(R.id.post_description);
    textTime = (TextView) itemView.findViewById(R.id.post_time);
    postImage = (ImageView) itemView.findViewById(R.id.post_image);
 }
}

这里是模型

package com.example.myapp.model;

public class Posts {
public String time, post, uid, image;

public Posts() {
}
public Posts(String time, String post, String uid, String image) {
    this.time = time;
    this.post = post;
    this.uid = uid;
    this.image = image;
}
public String getTime() {
    return time;
}
public void setTime(String time) {
    this.time = time;
}
public String getPost() {
    return post;
}
public void setPost(String post) {
    this.post = post;
}
public String getUid() {
    return uid;
}
public void setUid(String uid) {
    this.uid = uid;
}
public String getImage() {
    return image;
}
public void setImage(String image) {
    this.image = image;
}
}

这里是homefragment

    postListView = (RecyclerView)rootView.findViewById(R.id.all_user_post_list);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    linearLayoutManager.setReverseLayout(true);
    linearLayoutManager.setStackFromEnd(true);
    postListView.setHasFixedSize(true);
    postListView.setLayoutManager(linearLayoutManager);
    firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<Posts>()
            .setQuery(PostsRef, Posts.class)
            .build();
    firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Posts, PostViewHolder>(firebaseRecyclerOptions) {
        private final static int TEXT_ONLY = 1;
        private final static int TEXT_WITH_IMAGE= 0;


        public int getItemViewType(int position){
            switch (position){
                case 1:
                    return TEXT_ONLY;
                default:
                    return TEXT_WITH_IMAGE;
            }
        }

        @Override
        protected void onBindViewHolder(@NonNull PostViewHolder holder, int position, @NonNull Posts model) {
            if(holder.postImage !=null){
                holder.textTime.setText(model.getTime());
                holder.textPost.setText(model.getPost());
                Picasso.get().load(model.getImage()).into(holder.postImage);
            }else{
                holder.textTime.setText(model.getTime());
                holder.textPost.setText(model.getPost());
            }

        }

        @NonNull
        @Override
        public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
          int layoutRes = 0;
            switch (viewType) {
                case TEXT_ONLY:
                    layoutRes = R.layout.layout_posts;
                    break;
                case TEXT_WITH_IMAGE:
                    layoutRes = R.layout.layout_posts_with_image;
                    break;
            }
            View view = LayoutInflater.from(parent.getContext()).inflate(layoutRes, parent, false);
            return new PostViewHolder(view);
        }
    };

    firebaseRecyclerAdapter.startListening();
    postListView.setAdapter(firebaseRecyclerAdapter);
    return rootView;

更新: 我认为与其使用两种不同的布局,不如使用一种布局并为要更改的每个元素设置可见性更容易。

【问题讨论】:

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


【解决方案1】:

这是一个很常见的问题。你必须覆盖getItemViewType(你已经完成了),然后返回一个不同的持有者。

我在here给出的答案中展示了我的实现方式

如果您有任何其他问题,请随时提出 快乐编码

【讨论】:

  • 我的代码有问题吗?因为我仍然得到那种奇怪的行为,比如它在第一个数据中使用 layout_post_with_image,在第二个数据中使用 layout_post,在第三个和它的 show layout_post_with_image 中,无论我放什么数据,我都尝试了实现它的方法,并得到结果相同。
  • 首先我可以看到您的代码不完整。其次,getItemViewType 应该在 Adapter 内部(有一个方法是 Adapter 的一部分,您可以覆盖)。最后,您仅将 TEXT_ONLY 用于第一个位置。
  • @IonutJ.Bejan 如果您的链接答案确实也是此问题的答案,请将此问题链接为副本。
【解决方案2】:

我认为,您应该在 onBindViewHolder 中调用 getItemViewType 以避免检查 image == null 并在方法 getItemViewType 中执行检查。

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    相关资源
    最近更新 更多