在android中创建一个网格视图,行中的项目宽度不相等

在android中创建一个网格视图,行中的项目宽度不相等,android,gridview,android-recyclerview,gridlayoutmanager,Android,Gridview,Android Recyclerview,Gridlayoutmanager,我正在尝试创建一个模拟下图的布局 所需屏幕的用户界面: 我需要在列表中调用两个xml文件。它们的属性和列表中的行数是动态的,所以在运行时填充。他们的身高是一样的。但是,其宽度必须以1:1:1.3的比例分布在整个屏幕上 我首先尝试使用gridview,然后尝试使用gridlayoutmanager进行recyclerview。我可以在适配器的onBindViewHolder()中静态设置宽度。但是对于不同的屏幕,它是不同的,并且也会影响我使用RecyclerView.ItemEncoration

我正在尝试创建一个模拟下图的布局

所需屏幕的用户界面:

我需要在列表中调用两个xml文件。它们的属性和列表中的行数是动态的,所以在运行时填充。他们的身高是一样的。但是,其宽度必须以1:1:1.3的比例分布在整个屏幕上

我首先尝试使用gridview,然后尝试使用gridlayoutmanager进行recyclerview。我可以在适配器的onBindViewHolder()中静态设置宽度。但是对于不同的屏幕,它是不同的,并且也会影响我使用RecyclerView.ItemEncoration设置的项目之间的间距。有没有办法动态设置行中其他项目的宽度

以下是我的部分代码:

在活动的onCreate()中:

recyclerViewLayoutManager = new GridLayoutManager(context,3);
int spacingInPixels =    getResources().getDimensionPixelSize(R.dimen._3sdp);
recyclerView.addItemDecoration(new StoreSpaces(spacingInPixels));
recyclerView.setLayoutManager(recyclerViewLayoutManager);
recyclerView.setAdapter(new StoreRecycleAdapter(context,backgroundTheme, categoryNames));
适配器类:

public class StoreRecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

Context context;
int[] contentBg ;
final int CATEGORY =0, SUBCATEGORY=1;
String[] catNames;

StoreRecycleAdapter (Context context, int[] contentBg, String[] catNames){
    this.contentBg =contentBg;
    this.context   =context;
    this.catNames  =catNames 

}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder viewHolder;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());

    switch (viewType) {
        case CATEGORY:
            View v1 = inflater.inflate(R.layout.category,parent, false);
            viewHolder = new ViewHolder1(v1);
            break;
        case SUBCATEGORY:
            View v2 = inflater.inflate(R.layout.subcategory, parent, false);
            viewHolder = new ViewHolder1(v2);
            break;
        default:
            View v3 = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);
            viewHolder = new ViewHolder1(v3);
            break;
    }

    return viewHolder;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    switch (holder.getItemViewType()) {
        case CATEGORY:

            break;
        case SUBCATEGORY:
           /* ViewGroup.LayoutParams params2 = holder.itemView.getLayoutParams();
            params2.width =270;
            holder.itemView.setLayoutParams(params2);*/
            ViewHolder1 vh1 = (ViewHolder1) holder;
            vh1.gridText.setText(catNames[position]);
            vh1.gridLL.setBackgroundResource(contentBg[position]);
            break;
        default:

            break;
    }


}


@Override
public int getItemViewType(int position) {
    if ((position-2)%3==0 ) {
        return CATEGORY;
    } else
        return SUBCATEGORY;


}

@Override
public int getItemCount() {
    return catNames.length ;
}

public class ViewHolder1 extends RecyclerView.ViewHolder{
    RelativeLayout gridLL;
    TextView gridText;
    public ViewHolder1(View v){
        super(v);
        gridLL = (RelativeLayout) v.findViewById(R.id.gridLayout);
        gridText = (TextView) v.findViewById(R.id.nameTxt);
    }
}
公共类StoreRecycleAdapter扩展了RecycleView.Adapter{
语境;
int[]contentBg;
最终整数类别=0,子类别=1;
字符串[]catNames;
StoreRecycleAdapter(上下文,int[]contentBg,String[]catNames){
this.contentBg=contentBg;
this.context=上下文;
this.catNames=catNames
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
RecyclerView.ViewHolder-ViewHolder;
LayoutInflater充气器=LayoutInflater.from(parent.getContext());
开关(视图类型){
个案类别:
视图v1=充气机。充气(右布局。类别,父项,错误);
viewHolder=新的ViewHolder1(v1);
打破
案例子类别:
视图v2=充气机。充气(R.layout.subcategory,parent,false);
viewHolder=新的ViewHolder1(v2);
打破
违约:
视图v3=充气机。充气(android.R.layout.simple\u list\u item\u 1,父项,false);
viewHolder=新的ViewHolder1(v3);
打破
}
返回视图持有者;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
开关(holder.getItemViewType()){
个案类别:
打破
案例子类别:
/*ViewGroup.LayoutParams params2=holder.itemView.getLayoutParams();
参数2.width=270;
holder.itemView.setLayoutParams(params2)*/
ViewHolder1 vh1=(ViewHolder1)支架;
vh1.gridText.setText(catNames[position]);
vh1.gridLL.setBackgroundResource(contentBg[位置]);
打破
违约:
打破
}
}
@凌驾
public int getItemViewType(int位置){
如果((位置-2)%3==0){
退货类别;
}否则
返回子类别;
}
@凌驾
public int getItemCount(){
返回catNames.length;
}
公共类ViewHolder 1扩展了RecyclerView.ViewHolder{
相对网格;
文本视图网格文本;
公共视图持有者1(视图v){
超级(五);
gridLL=(RelativeLayout)v.findViewById(R.id.gridLayout);
gridText=(TextView)v.findViewById(R.id.nameTxt);
}
}

}

提供一些相关的代码跟踪,我们可以从中参考。