recyclerview中的多个布局

ht4b089n  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(454)

我想做一个类似聊天的表示,其中我有三个布局:mainactivity:我有一个recyclerview布局\u sent:这是发送消息的布局\u received:这是接收消息的布局
我使用的是mysql数据库:获取数据的查询是:

  1. Select cr.user_id, cr.reply, d.griev_desc, c.user_one, c.user_two from grievance_details d , conversation_reply cr, conversation c where d.complain_id = 11 and cr.complain_id = d.complain_id and c.complain_id = 11

这是给我的输出:

我的android适配器代码是:

  1. public class DifferentRowAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
  2. String user_one;
  3. String user_two;
  4. ArrayList<String> user_id_array;
  5. ArrayList<String> griev_desc_array;
  6. ArrayList<String> reply_array_emp;
  7. ArrayList<String> reply_array_hr;
  8. Context c;
  9. public DifferentRowAdapter(Context c, String user_one, String user_two,
  10. ArrayList<String> user_id_array, ArrayList<String> griev_desc_array,
  11. ArrayList<String> reply_array_emp, ArrayList<String> reply_array_hr) {
  12. this.c =c ;
  13. this.user_id_array = user_id_array;
  14. this.user_one = user_one;
  15. this.user_two = user_two;
  16. this.griev_desc_array = griev_desc_array;
  17. this.reply_array_emp = reply_array_emp;
  18. this.reply_array_hr = reply_array_hr;
  19. }
  20. @Override
  21. public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  22. View view;
  23. System.out.println("top of for onCreateView");
  24. //for(String s : user_id_array)
  25. for(int i =0;i<user_id_array.size();i++)
  26. {
  27. System.out.println("in side for");
  28. if(user_id_array.get(i).equals(user_one)){
  29. //if(!s.equals(user_one)){
  30. //System.out.println("in side if onCreateViewHolder"+s);
  31. System.out.println("in side if onCreateViewHolder"+user_id_array.get(i));
  32. view = LayoutInflater.from(parent.getContext()).inflate(R.layout.model_emp_conv, parent, false);
  33. return new EmployeeViewHolder(view);
  34. }else if(user_id_array.get(i).equals(user_two)){
  35. //System.out.println("in side else if onCreateViewHolder"+s);
  36. System.out.println("in side if onCreateViewHolder"+user_id_array.get(i));
  37. view = LayoutInflater.from(parent.getContext()).inflate(R.layout.model_hr_conv, parent, false);
  38. return new HrViewHolder(view);
  39. }
  40. else
  41. {
  42. //System.out.println("in side else onCreateViewHolder"+s);
  43. System.out.println("in side if onCreateViewHolder"+user_id_array.get(i));
  44. }
  45. }
  46. return null;
  47. }
  48. @Override
  49. public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  50. System.out.println("top of for");
  51. //for(String s : user_id_array)
  52. for(int i =0;i<user_id_array.size();i++)
  53. {
  54. System.out.println("in side for");
  55. if(user_id_array.get(i).equals(user_one)){
  56. System.out.println("in side if onBindViewHolder"+ user_id_array.get(i));
  57. //System.out.println("in side if onBindViewHolder"+s);
  58. //holder.employee_conversation.setText(reply_array_emp.get(position));
  59. ((EmployeeViewHolder)holder).employee_conversation.setText(reply_array_emp.get(position));
  60. }else if(user_id_array.get(i).equals(user_two)){
  61. //System.out.println("in side else if onBindViewHolder"+s);
  62. System.out.println("in side if onBindViewHolder"+user_id_array.get(i));
  63. ((HrViewHolder) holder).hr_conversation.setText(reply_array_hr.get(position));
  64. }
  65. else
  66. {
  67. //System.out.println("in side else onBindViewHolder"+s);
  68. }
  69. }
  70. }
  71. @Override
  72. public int getItemCount() {
  73. return user_id_array.size();
  74. }

}
但是,我仍然无法对这两种布局进行充气,因为我在以下方面遇到了一个错误:

  1. ((HrViewHolder) holder).hr_conversation.setText(reply_array_hr.get(position));

说打字不可能。
其他两个持有人类别为:

  1. public class HrViewHolder extends RecyclerView.ViewHolder {
  2. TextView hr_conversation;
  3. public HrViewHolder(View itemView) {
  4. super(itemView);
  5. hr_conversation =(TextView) itemView.findViewById(R.id.hr_conversation);
  6. System.out.println("in hrViewHolder");
  7. }

}

  1. public class EmployeeViewHolder extends RecyclerView.ViewHolder {
  2. TextView employee_conversation;
  3. public EmployeeViewHolder(View itemView) {
  4. super(itemView);
  5. employee_conversation=(TextView) itemView.findViewById(R.id.employee_conversation);
  6. System.out.println("in employeeViewHolder");
  7. }

}
我将代码修改为:

  1. public class DifferentRowAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
  2. String user_one;
  3. String user_two;
  4. ArrayList<String> user_id_array;
  5. ArrayList<String> griev_desc_array;
  6. ArrayList<String> reply_array_emp;
  7. ArrayList<String> reply_array_hr;
  8. Context c;
  9. public DifferentRowAdapter(Context c, String user_one, String user_two,
  10. ArrayList<String> user_id_array, ArrayList<String> griev_desc_array,
  11. ArrayList<String> reply_array_emp, ArrayList<String> reply_array_hr) {
  12. this.c =c ;
  13. this.user_id_array = user_id_array;
  14. this.user_one = user_one;
  15. this.user_two = user_two;
  16. this.griev_desc_array = griev_desc_array;
  17. this.reply_array_emp = reply_array_emp;
  18. this.reply_array_hr = reply_array_hr;
  19. }
  20. @Override
  21. public int getItemViewType(int position) {
  22. for(String s: user_id_array)
  23. {
  24. if(s.equals(user_one))
  25. {
  26. return Integer.parseInt(user_one);
  27. }
  28. else if(s.equals(user_two))
  29. return Integer.parseInt(user_two);
  30. else
  31. return 3;
  32. }
  33. return 0;
  34. }
  35. @Override
  36. public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  37. View view;
  38. System.out.println("top of for onCreateView");
  39. switch (viewType)
  40. {
  41. case 1 :
  42. System.out.println("in side case 1 onCreateViewHolder viewType "+ viewType);
  43. view = LayoutInflater.from(parent.getContext()).inflate(R.layout.model_emp_conv, parent, false);
  44. return new EmployeeViewHolder(view);
  45. case 2:
  46. System.out.println("in side case 2 onCreateViewHolder viewType "+ viewType);
  47. view = LayoutInflater.from(parent.getContext()).inflate(R.layout.model_hr_conv, parent, false);
  48. return new HrViewHolder(view);
  49. }
  50. return null;
  51. }
  52. @Override
  53. public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  54. System.out.println("top of for");
  55. //for(String s : user_id_array)
  56. for(int i =0;i<user_id_array.size();i++)
  57. {
  58. System.out.println("in side for");
  59. if(user_id_array.get(i).equals(user_one)){
  60. System.out.println("in side if onBindViewHolder"+ user_id_array.get(i));
  61. //System.out.println("in side if onBindViewHolder"+s);
  62. //holder.employee_conversation.setText(reply_array_emp.get(position));
  63. //((EmployeeViewHolder)holder).employee_conversation.setText(reply_array_emp.get(position));
  64. }else if(user_id_array.get(i).equals(user_two)){
  65. //System.out.println("in side else if onBindViewHolder"+s);
  66. System.out.println("in side if onBindViewHolder"+user_id_array.get(i));
  67. //((HrViewHolder) holder).hr_conversation.setText(reply_array_hr.get(position));
  68. }
  69. else
  70. {
  71. //System.out.println("in side else onBindViewHolder"+s);
  72. }
  73. }
  74. }
  75. @Override
  76. public int getItemCount() {
  77. return user_id_array.size();
  78. }

}

nhjlsmyf

nhjlsmyf1#

首先,数组中不需要for循环,因为传递了视图的位置,所以可以安全地将其修改为

  1. @Override
  2. public int getItemViewType(int position) {
  3. if(user_id_array.get(position).equals(user_one))
  4. return 1;
  5. else if(user_id_array.get(position).equals(user_two))
  6. return 2;
  7. else
  8. return 3;
  9. }

这同样适用于 onBindViewHolder ,在那里你有 ViewHolder 示例作为参数传递,因此您需要在运行时检查其类型以了解要绑定到的布局(使用 instanceof 操作员)。

  1. @Override
  2. public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  3. if (holder instanceof EmployeeViewHolder) {
  4. System.out.println("in side for");
  5. System.out.println("in side if onBindViewHolder"+ user_id_array.get(position));
  6. //System.out.println("in side if onBindViewHolder"+s);
  7. //holder.employee_conversation.setText(reply_array_emp.get(position));
  8. ((EmployeeViewHolder)holder).employee_conversation.setText(reply_array_emp.get(position));
  9. } else if(holder instanceof HrViewHolder){
  10. //System.out.println("in side else if onBindViewHolder"+s);
  11. System.out.println("in side if onBindViewHolder"+user_id_array.get(position));
  12. ((HrViewHolder) holder).hr_conversation.setText(reply_array_hr.get(position));
  13. } else {
  14. //System.out.println("in side else onBindViewHolder"+s);
  15. }
  16. }

希望这有帮助!

展开查看全部
mrfwxfqh

mrfwxfqh2#

重写适配器中的getitemviewtype()。然后基于oncreateviewholder中的viewtype参数返回viewholder。
我希望下面的链接能帮助您在recycleview适配器中进行多布局:

相关问题