Android 如何在RecyclerView中显示多个项目类型?
我正在用java创建一个android应用程序,我正在使用Room数据库。 我有三张桌子: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
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);
}
}
);
}