Изменение размера одного столбца в GridLayoutManager

Я создал GridLayoutManager, который будет использовать мои данные и отображать их правильно, а также мои - довольно большое количество - визуальных параметров.

Сетка содержит только текст, и теперь у меня есть требование растянуть крайний левый столбец, чтобы он уместился на всю ширину моего текста. Тем не менее, несмотря на все мои удары и подталкивания, мне еще предстоит сделать так, чтобы размер ЛЮБОГО столбца не изменился.

Мой текущий GridAdapter, все попытки изменения размера удалены:

public DatagridAdapter(Context context, ArrayList data, String colour, int widgetZoneW, int widgetZoneH, int columns, int rows, boolean withHeader, int gridTextSize, Boolean showBorders,
                       Boolean boldFirstColumn, Boolean boldFirstRow, int backgroundOpacityConverted, String gridColour, String gridFontAlignment, String topRowFontCol, String topRowBgColor,
                       Boolean alternating, Boolean topRowHiglight, String headerFontAlign, int HeaderFontSize) {
    list = data;
    internalColour = colour;
    internalWidgetH = widgetZoneH;
    internalWidgetW = widgetZoneW;
    columnCount = columns;
    rowCount = rows;
    isHeader = withHeader;
    sourceContext = context;
    boldRow = boldFirstRow;
    boldColumn = boldFirstColumn;
    gridFontSize = gridTextSize;
    opacityBG = backgroundOpacityConverted;
    alignment = gridFontAlignment;
    bgColour = gridColour;
    topRowFontColour = topRowFontCol;
    isTopRowColoured = topRowHiglight;
    isAlternating = alternating;
    topRowBgColour=topRowBgColor;
    headerFontAlignment = headerFontAlign;
    headerFontSize = HeaderFontSize;

    for (int i = 0; i < list.size(); i++){
        TextPaint paint = new TextPaint();
        paint.setTextSize(gridFontSize);


        if (paint.measureText(list.get(i).toString()) > largestText){
            largestText = Math.round(paint.measureText(list.get(i).toString()));
        }
        Log.wtf("TEXTSIZE", "Largest Text is: "+largestText);
    }
}


@Override
public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
    final TextView v = (TextView) LayoutInflater.from(parent.getContext()).inflate(R.layout.gridtv, parent, false);
    int modColumn = viewCount%columnCount;

    ViewHolder vh = new ViewHolder(v);
    v.setTextColor(Color.parseColor(internalColour));
    v.setTextSize(gridFontSize);
    v.setHeight((internalWidgetH/rowCount)-2);
    v.setBackgroundColor(Color.parseColor(bgColour));
    v.getBackground().setAlpha(opacityBG);

    if (alignment.equalsIgnoreCase("right")) {
        v.setGravity(Gravity.RIGHT|Gravity.CENTER_VERTICAL);
    } else if (alignment.equalsIgnoreCase("left")) {
        v.setGravity(Gravity.LEFT|Gravity.CENTER_VERTICAL);
    } else if (alignment.equalsIgnoreCase("center")) {
        v.setGravity(Gravity.CENTER|Gravity.CENTER_VERTICAL);
    }
    viewCount++;
    return vh;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    int modTestColumn = position%columnCount;

    if (boldRow){
        if (position<columnCount){
            holder.tv.setTypeface(null, Typeface.BOLD);
            holder.tv.setTextColor(Color.parseColor(topRowFontColour));
            holder.tv.setBackgroundColor(Color.parseColor(topRowBgColour));
        }
    }
    if (boldColumn){
        if (modTestColumn==0){
            holder.tv.setTypeface(null, Typeface.BOLD);
        }
    }
    if (isAlternating) {
        if ((position / columnCount) % 2 == 0&&(position>columnCount)) {
        }else if (position>=columnCount){
            holder.tv.setBackgroundColor(Color.WHITE);

        }
    }else{
        if (position<columnCount){
            holder.tv.setTextColor(Color.parseColor(topRowFontColour));
            holder.tv.setBackgroundColor(Color.parseColor(topRowBgColour));
        }
    if (((position / columnCount) % 2 == 0)&&(position>columnCount)){
        //holder.tv.setBackgroundColor(Color.WHITE);

    }
}
if (position<columnCount){
    //Stuff for header
    if (headerFontAlignment.equalsIgnoreCase("right")) {
        holder.tv.setGravity(Gravity.RIGHT|Gravity.CENTER_VERTICAL);
    } else if (headerFontAlignment.equalsIgnoreCase("left")) {
        holder.tv.setGravity(Gravity.LEFT|Gravity.CENTER_VERTICAL);
    } else if (headerFontAlignment.equalsIgnoreCase("center")) {
        holder.tv.setGravity(Gravity.CENTER|Gravity.CENTER_VERTICAL);
    }
    holder.tv.setTextSize(headerFontSize);
    holder.tv.setTextColor(Color.parseColor(topRowFontColour));
    holder.tv.setBackgroundColor(Color.parseColor(topRowBgColour));

}
    holder.tv.setText(list.get(position).toString());


}

Что я пробовал:

В моем onCreateViewHolder я отследил свою позицию, сделал математику, чтобы определить, нахожусь ли я в первом столбце, затем установил расположение и minWidth в длину самой длинной строки:

 if (modColumn==0){
        v.setSingleLine(true);
        v.setMinimumWidth(largestText);
        v.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    }

Однако это не работает, все мои столбцы остаются одинаковой ширины.

Чего не хватает? Почему я не могу изменить ширину моих столбцов?

Решение в xml (такое как это) не будет применимо, так как мне нужно, чтобы размеры изменялись динамически.

(Я немного грязный кодер, пожалуйста, прости меня).

1 ответ

Ты пробовал это?

GridView с различными размерами столбцов

или это

Пользователь RecyclerView с GridLayoutManager, который установил SpanSizeLookup. Так будет и так:

int fullSpanSize = 3;
int normalSpanSize = 1;

GridLayoutManager layout = new GridLayoutManager(context, fullSpanSize);
layout.setSpaneSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        return position == 3 ? fullSpanSize : normalSpanSize;
    }
});
recyclerView.setLayoutManager(layout);

взяты из: GridView: GridView с различными размерами ячеек и макетом,

Другие вопросы по тегам