【问题标题】:How do I show info from two different models / adapters in one recyclerview如何在一个回收站视图中显示来自两个不同型号/适配器的信息
【发布时间】:2021-02-10 18:35:43
【问题描述】:

我有两个模型(ModelChat 和 ModelUsers)和它们的类适配器(PostsAdapter 和 AllUsersAdapter)。 我想从 ModelUser 获取和设置用户信息(例如姓名和电子邮件),并从 Firebase 数据库中的 ModelPost 获取和设置帖子信息到我的 HomeActivity 中的相同 recyclerview 中。 代码如下:

PostsAdapter.java

公共类 PostsAdapter 扩展 RecyclerView.Adapter{

Context context;
List<ModelPost> postList;

public PostsAdapter(Context context, List<ModelPost> postList) {
    this.context = context;
    this.postList = postList;
}

@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    //inflate layout row_post.xml
    View view = LayoutInflater.from(context).inflate(R.layout.row_posts, parent, false);
    return new MyHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyHolder holder, int position) {
    //get data
    String userUID = postList.get(position).getUserUID();
    String userEmail = postList.get(position).getUserEmail();
    String userProfilePic = postList.get(position).getUserProfilePic();
    String firstName = postList.get(position).getUserFirstName();
    String lastName = postList.get(position).getUserLastName();
    String userNickName = postList.get(position).getUserNickName();
    String postTimeStamp = postList.get(position).getPostTime();
    String userPost = postList.get(position).getUserPost();

    //set data
    //set data
    Glide
            .with(context)
            .load(userProfilePic)
            .apply(RequestOptions.circleCropTransform())
            .into(holder.avatarTv);
    holder.firstnameTv.setText(firstName);
    holder.lastnameTv.setText(lastName);
    holder.nicknameTv.setText(userNickName);


}

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

//view holder class
class MyHolder extends RecyclerView.ViewHolder {

    //views from row_posts layout


    public MyHolder(@NonNull View itemView) {
        super(itemView);
        //init view
        //my views here
    }
}

}

AllUsersAdapter.java

公共类 AllUsersAdapter 扩展 RecyclerView.Adapter{

Context context;
List<ModelUser> userList;

//Constructor > Generate
public AllUsersAdapter(Context context, List<ModelUser> userList) {
    this.context = context;
    this.userList = userList;
}

@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    //Inflate layout (row_user)
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_all_users, parent, false);

    return new MyHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyHolder holder, int position) {
    //get data
    String userUID = userList.get(position).getUid();
    String userProfilePic = userList.get(position).getProfilepic();
    String userName = userList.get(position).getFirstname() + " " + userList.get(position).getLastname();
    String userNickname = userList.get(position).getNickname();
    String userStatus = userList.get(position).getStatus();

    //set data
    Glide
            .with(context)
            .load(userProfilePic)
            .apply(RequestOptions.circleCropTransform())
            .into(holder.mAvatarIv);

    holder.mNameTv.setText(userName);
    holder.mNicknameTv.setText(userNickname);
    holder.mStatusTv.setText(userStatus);

    //Handle item click
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            /*Click user from user list to start conversation
             *Start Activity by putting UID of receiver
             *we will use that UID to identify the user we are gonna chat */

            Intent intent = new Intent(context, MessageActivity.class);
            intent.putExtra("userUid", userUID);
            context.startActivity(intent);

        }
    });

}

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

class MyHolder extends RecyclerView.ViewHolder {

    public MyHolder(@NonNull View itemView) {
        super(itemView);

        //init my views here

    }
}

}

HomeActivity.java

公共类 HomeActivity 扩展 AppCompatActivity {

FirebaseAuth firebaseAuth;

RecyclerView recyclerView;
List<ModelPost> postList;
PostsAdapter postsAdapter;

String mUID;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    firebaseAuth = FirebaseAuth.getInstance();
    //recyclerview and its properties
    recyclerView = findViewById(R.id.posts_recyclerview);

    //init post list
    postList = new ArrayList<>();

    loadPosts();

}

private void loadPosts() {
    //path of all posts
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");
    //get all data from this reference
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            postList.clear();
            for (DataSnapshot ds: snapshot.getChildren()) {
                ModelPost modelPost = ds.getValue(ModelPost.class);

                postList.add(modelPost);

                //adapter
                postsAdapter = new PostsAdapter(HomeActivity.this, postList);
                //set adapter to recyclerview
                recyclerView.setAdapter(postsAdapter);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            //in case of errors
            //Toast.makeText(HomeActivity.this, ""+error.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

}

【问题讨论】:

  • 所需 UI 的任何屏幕截图。
  • 我认为您需要先将数据合并到一个列表中,然后定义一个定义 UI 的适配器。
  • 目前我无法发布图片。但我想要实现的是:我需要每个完整的帖子在回收站视图中排成一行。就像 Twitter 帖子一样,用户头像、姓名和帖子在同一行,但从不同的适配器/模型中获取数据,正如我上面解释的那样。
  • 首先处理数据,这样单个列表中的每个列表项都包含您想要显示的所有数据。然后定义一个适配器。
  • 如果您可以根据我上面提供的代码给出一个示例,这将有所帮助。因为目前我使用的自定义列表视图(row_post.xml)包含我想要的所有字段。我面临的问题是设置来自两个不同模型的数据,甚至组合数据以显示在一个适配器中。

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


【解决方案1】:

尝试使用 ConcatAdapter。

一个 RecyclerView.Adapter 实现,按顺序呈现多个适配器的内容。 More info

使用 ConcatAdapter 顺序连接适配器: https://medium.com/androiddevelopers/merge-adapters-sequentially-with-mergeadapter-294d2942127a

【讨论】:

  • 我需要将每个完整的帖子放在回收站视图中的一行中。就像 Twitter 帖子一样,用户头像、姓名和帖子在同一行,但从不同的适配器/模型获取数据,正如我上面解释的那样。
【解决方案2】:

我认为这会有所帮助

 MyAdapter adapter1 = ...;
 AnotherAdapter adapter2 = ...;
 ConcatAdapter concatenated = new ConcatAdapter(adapter1, adapter2);
 recyclerView.setAdapter(concatenated);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多