Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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中显示多个项目类型?_Android_Mysql_Android Room - Fatal编程技术网

Android 如何在RecyclerView中显示多个项目类型?

Android 如何在RecyclerView中显示多个项目类型?,android,mysql,android-room,Android,Mysql,Android Room,我正在用java创建一个android应用程序,我正在使用Room数据库。 我有三张桌子: Users table( user_id and user_name) Products table( product_id and product_name) Orders table ( order_id , user_id and product_id ) 我使用ViewModel查询信息并将其填充到UI 我有一个查询是从订单表用户id和产品id获取的。 我有这个案子: 用户id号1已订购3

我正在用java创建一个android应用程序,我正在使用Room数据库。 我有三张桌子:

Users table( user_id and user_name) 
Products table( product_id and product_name)
Orders table ( order_id  , user_id  and product_id )
我使用ViewModel查询信息并将其填充到UI

我有一个查询是从订单表
用户id
产品id
获取的。 我有这个案子: 用户id号1已订购3种产品

private void setUpViewModel() {

viewModel.getUserProduct(1).observe(this,new Observer<List<OrdersTable>>() {
            @Override
            public void onChanged(@Nullable List<OrdersTable> order) {
                mAdapter.setUserList((ArrayList<OrdersTable>) order);
            }
        }
       );
     }

公共类MyAdapter扩展了RecyclerView.Adapter{ 私有上下文; 数组列表顺序列表; ArrayList用户列表; ArrayList产品列表; 公共MyAdapter(上下文){ this.mContext=上下文; } @非空 @凌驾 public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){ View=LayoutInflater.from(parent.getContext()).flate(R.layout.adapter_ts,parent,false); MyAdapter.MyViewHolder viewHolder=新的MyAdapter.MyViewHolder(视图); 返回视图持有者; } @凌驾 public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder,int位置){ OrderTable orders=订单列表.get(位置); UserTable user=user\u list.get(位置); ProductTable ProductTable=产品列表.get(位置); holder.tv_userName.setText(user.getUserName()); holder.tv\u productName.setText(productTable.getProductName()); } @凌驾 public int getItemCount(){ if(订单列表==null){ 返回0; } 退货单_list.size(); } 公共类MyViewHolder扩展了RecyclerView.ViewHolder{ TextView tv\u用户名,tv\u产品名称; 公共MyViewHolder(查看项目视图){ 超级(项目视图); tv\u userName=itemView.findviewbyd(R.id.tv\u userName\u xml); tv\U productName=itemView.findViewById(R.id.tv\U prodcutName\U xml); } } 公共无效集合列表(ArrayList ts){ 此.order_list=ts; notifyDataSetChanged(); } }
您可以像这样在onBindViewHolder中创建多个循环视图

@Override
    public void onBindViewHolder(ItemRowHolder itemRowHolder, int i) {

        final String sectionName = dataList.get(i).getHeaderTitle();

        ArrayList singleSectionItems = dataList.get(i).getAllItemsInSection();

        itemRowHolder.itemTitle.setText(sectionName);

        SectionListDataAdapter itemListDataAdapter = new SectionListDataAdapter(mContext, singleSectionItems);

        itemRowHolder.recycler_view_list.setHasFixedSize(true);
        itemRowHolder.recycler_view_list.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false));
        itemRowHolder.recycler_view_list.setAdapter(itemListDataAdapter);

    }



public class ItemRowHolder extends RecyclerView.ViewHolder {

        protected TextView itemTitle;

        protected RecyclerView recycler_view_list;




        public ItemRowHolder(View view) {
            super(view);

            this.itemTitle = (TextView) view.findViewById(R.id.itemTitle);
            this.recycler_view_list = (RecyclerView) view.findViewById(R.id.recycler_view_list);


        }

    }

我的建议是使用不同的视图类型

首先,您必须为适配器提供数据源的抽象。通常我们有一个简单的数组或列表作为数据源,但在您的例子中,您有三种类型,而不是一种。因此,您可以创建一个接口或使用一个集合在适配器中存储所有数据,具体方式由您决定。 之后,您必须为每种类型的模型创建不同的常量。在您的示例中,您有三个模型:用户、产品和订单。所以我建议为每种类型创建三个常量。这些常量应作为静态字段放置在适配器类中

private static final int USER_VIEW_TYPE = 1;
private static final int PRODUCT_VIEW_TYPE = 2;
private static final int ORDER_VIEW_TYPE = 3;
然后,您必须重写适配器中的方法
getItemViewType(int位置)
。在这里,您必须告诉适配器特定项的类型。例如,您决定将所有数据存储为
列表
(但不要在生产代码中这样做,我在这里使用的是
对象
类型,仅举个例子)。因此,在本例中,您的方法如下所示:

@Override public int getItemViewType(int position) {
    if (data[position] instanceof User) {
        return USER_VIEW_TYPE;
    } else if (data[position] instanceof PRODUCT_VIEW_TYPE) {
        return PRODUCT_VIEW_TYPE;
    } else return ORDER_VIEW_TYPE;
}
之后,您需要为您的类型创建不同的ViewHolder,这样您将有一个
UserViewHolder
、一个
ProductViewHolder
和一个
OrderViewHolder
。 并且,为了最终区分它们,应该在
onCreateViewHolder
方法中使用
viewType
参数。逻辑非常简单:您必须检查此参数的值,并根据结果为不同的布局充气。例如:

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        if (viewType == USER_VIEW_TYPE) {
            return new UserViewHolder(layoutInflater.inflate(R.layout.item_user_type, parent));
        } else if (viewType == PRODUCT_VIEW_TYPE) {
            return new ProductViewHolder(layoutInflater.inflate(R.layout.item_product_type, parent));
        } else return new OrderViewHolder(layoutInflater.inflate(R.layout.item_order_type, parent));
    }

您可以连接这些表中的数据,并将结果绑定到名为
ResultModel
的自定义模型类中。您可以从该
ResultModel
中获取
user\u name
product\u name

用户表格

产品表格

t\u顺序表格

加入查询:

从用户u、产品p、订单o中选择u.user\u名称、p.product\u名称 其中o.user\u id=u.user\u id,o.product\u id=p.product\u id

结果

创建一个模型类
ResultModel

public class ResultModel {
  public String getUser_name() {
   return user_name;
  }

  public String getProduct_name() {
   return product_name;
  }

  private String user_name;
  private String product_name;
}
更新的观察者

注意:在
适配器
中需要时,也用
ResultModel
替换
OrdersTable

viewModel.getUserProduct(1).observe(this,new Observer<List<ResultModel>>() {
        @Override
        public void onChanged(@Nullable List<ResultModel> order) {
            mAdapter.setUserList((ArrayList<ResultModel>) order);
        }
    }
   );
 }
viewModel.getUserProduct(1).observe(这是一个新的观察者(){
@凌驾
更改后的公共void(@Nullable List order){
mAdapter.setUserList((ArrayList)顺序);
}
}
);
}

对不起,你的问题不清楚你想要什么。你能解释一下这个`UserTable user=order\u list.get(position);ProductTable ProductTable=订单列表.get(位置)`您正在从仅保存OrderTables的列表中获取UserTable、ProductTable。我希望从recyclerView中显示两种类型的对象(UserTable对象和ProductTable对象)。很抱歉,我没有声明变量ArrayList user\u list;ArrayList产品列表;应该是UserTable user=user\u list.get(position);PoductTable productTable=产品列表.get(位置);您想在一个名为
tv\u productName
TextView
中显示多个产品名称吗?能否确认您只想在同一个recyclerview项目中显示两个不同列表中的信息?他希望每个用户有多个产品,在这种情况下,您的建议无效。在onCreateViewHolder中有三种布局,layout.item\用户\类型、layout.item\用户\类型和item\订单\类型。我只有一个布局,所以您希望有一个单独的项目,其中放置用户名和他的所有产品,不是吗?如果是,那么您有两个选项:在每个项目中都有一个recyclerview,或者有一个容器并动态添加项目。第一个选项更难实现,但更不容易出错,也更容易维护。您找到解决方案了吗?@Query(“从用户u、产品p、t订单o中选择u.user\u名称、p.product\u名称,其中o.user\u id=u.user\u id和o.product\u id=p.product\u id”)
public class ResultModel {
  public String getUser_name() {
   return user_name;
  }

  public String getProduct_name() {
   return product_name;
  }

  private String user_name;
  private String product_name;
}
viewModel.getUserProduct(1).observe(this,new Observer<List<ResultModel>>() {
        @Override
        public void onChanged(@Nullable List<ResultModel> order) {
            mAdapter.setUserList((ArrayList<ResultModel>) order);
        }
    }
   );
 }