Как центрировать ячейку в TableRow с текстом и изображением вместе

У меня есть таблица, которая программно заполнена TableRows. Последняя строка должна содержать текст (размер зарплаты: «45K») и изображение рядом с текстом. Чтобы они были вместе, с минимальным пространством между концом текста и изображения. Я сделал следующий код:

        LinearLayout linearLayout = new LinearLayout(context);
        linearLayout.setOrientation(LinearLayout.HORIZONTAL);
        TableRow.LayoutParams params1 = new TableRow.LayoutParams(0, TableRow.LayoutParams.WRAP_CONTENT, (float) weights[6]);
        params1.gravity = Gravity.CENTER;
        linearLayout.setLayoutParams(params1);
        linearLayout.setGravity(Gravity.CENTER);

        TextView h1 = new TextView(context);
        h1.setText(SharedFunctions.makeSalaryString(scout.getSalary()));
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, (float) 0.9);
        h1.setLayoutParams(params);
        h1.setTextColor(resources.getColor(standingsTableHeadTXT));
        h1.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);
        h1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);


        ImageView cash = new ImageView(context);
        params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, (float) 0.1);
        params.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
        cash.setLayoutParams(params);
        cash.setImageDrawable(resources.getDrawable(R.mipmap.usd_sign));

        linearLayout.addView(h1);
        linearLayout.addView(cash);
        tableRow.addView(linearLayout);

Проблема в том, что он делает то, что я хотел, но все не по центру:

Как центрировать ячейку в TableRow с текстом и изображением вместе

Как правильно их соединить и в то же время по центру?

EDIT 1: If I substitute line h1.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);

от h1.setGravity (Gravity.CENTER);

Я получу это:

Как центрировать ячейку в TableRow с текстом и изображением вместе

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

Обновлено еще раз: Код функции, заполняющей строку элементами

public static TableRow createScoutRow(ScoutingPlayerJson scout, TableLayout tableLayout, Context context, Resources resources) {
    double[] weights = new double[]{0.1680, 0.2240, 0.1360, 0.0800, 0.0960, 0.1360, 0.1600};
    TableRow tableRow = new TableRow(context);
    TableRow.LayoutParams lp = new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT, 1);
    tableRow.setLayoutParams(lp);
    tableRow.setOrientation(TableRow.HORIZONTAL);
    tableRow.setBackgroundColor(resources.getColor(trainingPlayerSelectRowColor));
    tableRow.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
    tableRow.setTag(scout.getId());

    {
        TextView h1 = new TextView(context);
        h1.setText(String.valueOf(scout.getCoins()));
        TableRow.LayoutParams params = new TableRow.LayoutParams(0, TableRow.LayoutParams.WRAP_CONTENT, (float) weights[0]);
        h1.setLayoutParams(params);
        h1.setTextColor(resources.getColor(standingsTableHeadTXT));
        h1.setGravity(Gravity.CENTER);
        h1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
        tableRow.addView(h1);
    }

    {
        TextView h1 = new TextView(context);
        h1.setText(scout.getFirstname().charAt(0) + ". " + scout.getSurname());
        TableRow.LayoutParams params = new TableRow.LayoutParams(0, TableRow.LayoutParams.WRAP_CONTENT, (float) weights[1]);
        h1.setLayoutParams(params);
        h1.setTextColor(resources.getColor(standingsTableHeadTXT));
        h1.setGravity(Gravity.LEFT);
        h1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);

        tableRow.addView(h1);
    }

    {
        TextView h1 = new TextView(context);
        h1.setText(scout.getAge().toString());
        TableRow.LayoutParams params = new TableRow.LayoutParams(0, TableRow.LayoutParams.WRAP_CONTENT, (float) weights[2]);
        h1.setLayoutParams(params);
        h1.setTextColor(resources.getColor(standingsTableHeadTXT));
        h1.setGravity(Gravity.CENTER);
        h1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);

        tableRow.addView(h1);
    }

    {
        TextView h1 = new TextView(context);
        h1.setText(scout.getBatThrowType().toString().substring(3));
        TableRow.LayoutParams params = new TableRow.LayoutParams(0, TableRow.LayoutParams.WRAP_CONTENT, (float) weights[3]);
        h1.setLayoutParams(params);
        h1.setTextColor(resources.getColor(standingsTableHeadTXT));
        h1.setGravity(Gravity.CENTER);
        h1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);

        tableRow.addView(h1);
    }
    {
        LinearLayout linearLayout = new LinearLayout(context);
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        TableRow.LayoutParams params1 = new TableRow.LayoutParams(0, TableRow.LayoutParams.WRAP_CONTENT, (float) weights[4]);
        linearLayout.setLayoutParams(params1);
        linearLayout.setGravity(Gravity.CENTER);
        Set<String> set = Utils.fixPrefferedPositions(scout.getPrefferedPosition());
        int mysize = set.size();

        for (String position: set) {
            View imview = getImageViewByPosition(position, mysize, context);
            linearLayout.addView(imview);
        }
        tableRow.addView(linearLayout);
    }
    { 
        ImageView imview = getImageViewByRating(scout.getRating(), (float) weights[5], context);
        tableRow.addView(imview);
    }
    {
        LinearLayout linearLayout = new LinearLayout(context);
        linearLayout.setOrientation(LinearLayout.HORIZONTAL);
        TableRow.LayoutParams params1 = new TableRow.LayoutParams(0, TableRow.LayoutParams.WRAP_CONTENT, (float) weights[6]);
        params1.gravity = Gravity.CENTER;
        linearLayout.setLayoutParams(params1); 
        linearLayout.setGravity(Gravity.CENTER);

        TextView h1 = new TextView(context);
        h1.setText(SharedFunctions.makeSalaryString(scout.getSalary()));
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, (float) 0.9);
        h1.setLayoutParams(params);
        h1.setTextColor(resources.getColor(standingsTableHeadTXT));
        //h1.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);
        h1.setGravity(Gravity.CENTER);
        h1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);


        ImageView cash = new ImageView(context);
        params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, (float) 0.1);
        params.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
        cash.setLayoutParams(params);
        cash.setImageDrawable(resources.getDrawable(R.mipmap.usd_sign));

        linearLayout.addView(h1);
        linearLayout.addView(cash);
        tableRow.addView(linearLayout);
    }
    return tableRow;
}

Часть макета, в которой определяется таблица (в которую добавляются строки):

            <!--0.08    0.08    0.25    0.09    0.14    0.15    0.21-->
            <TableLayout
                android:id = "@+id/scoutsTable"
                android:layout_width = "fill_parent"
                android:layout_height = "fill_parent"
                android:divider = "@drawable/divider_stand_table_list"
                android:showDividers = "middle"
                android:isScrollContainer = "true"
                android:stretchColumns = "7"
                android:orientation = "horizontal">

            </TableLayout>

        </android.support.v4.widget.NestedScrollView>

опубликуйте свой полный код и желаемое выходное изображение.

Rumit Patel 02.05.2018 16:37

@RumitPatel Пожалуйста, взгляните на обновленный вопрос (редактировать 2)

maximus 04.05.2018 13:22
0
2
37
1

Ответы 1

Попробуйте заменить эту строку

h1.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);

с этим

h1.setGravity(Gravity.CENTER);

Пожалуйста, ознакомьтесь с обновлением (edit1) вопроса. Это работает, но изображение сейчас не в конце текста.

maximus 02.05.2018 16:18

Я сейчас плохо помню, почему вы используете setGravity для h1 и gravity для изображения наличных денег? вы могли бы попытаться это изменить?

firegloves 02.05.2018 16:25

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