Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: GridLayout vs GridView

Всем привет,

Занимаюсь созданием Layout-а табличного стиля и столкнулся с проблемой что мне необходимо таблица с ячейками одинакового размера, независомо от того есть ли у есть контент в ячейке или нету

Сначала за основу взял GridLayout, но проблема с ним в том что невозможно жестко задать размер ячеек да и еще так чтобы размер заждой ячейки определялся динамически и делился на 5 колонок к примеру:

(IMG:)

Потом переключился на GridView на нем же в принципе размер делится между всеми колонками:

(IMG:)

Собственно вопрос: Возможо ли сделать подобное для GridLayout, чтобы добавив один элемент он находился в первой колонке и первой строчке но при этом было выделено пустое место такого же размера для оставшихся элементов к примеру ?
Ответ:
написать потомок для GridLayout который будет при отрисовке задавать размер ячеек, например... я не сталкивалась с проблемой и это первое, что просто пришло в голову... могу попробовать вечером дома (на работе среды к сожалению нет) или можем стакнуться в скайпе, использование таблиц мне предстоит и сталкиваться с подобной проблемой желания нет, так что заранее устранить узкое место в моих интересах
Вопрос: Программно менять положение кнопок в GridLayout

Всем привет!
Пишу пятнашки :) 
В GridLayout имеется 15 кнопок, примерно таких:
<Button 
android:id="@+id/b3" 
android:layout_width="70dp" 
android:layout_height="70dp" 
android:layout_column="2" 
android:layout_row="0" 
android:text="3" 
"/>
Здесь layout_column и layout_row задает положение этих кнопок в грид лаяуте (в данном случае кнопка в первой строке и третьем столбце)
Вопрос: как программно менять эти параметры?
Нужно что-то типа:
b3. layout_column=3;
b3. layout_row=1;

Либо если проще сделать не в гридлаяуте, с удовольствием выслушаю предложения :)

Ответ:
Меняем :
Код

int row = 1;  // Номер строки
int column = 1; // Номер столбца
b3.setLayoutParams(new GridLayout.LayoutParams(
                              GridLayout.spec(row, GridLayout.CENTER),
                              GridLayout.spec(column, GridLayout.CENTER));

Проверяйте.
Вопрос: Разметка GridView

Как можно сделать разметку GridView, чтобы одна верхняя ячейка была по всей ширине экрана, а остальные - ниже шли обычно таблицей??Как так GridView настроить? И потом еще такой вопрос, у меня несколько категорий данных отображаются в GridView как их можно красиво разделить? Какой разделитель для этого есть?
Ответ: Для объединения ячеек лучше использовать GridLayout. Как это сделать можно посмотреть здесь:
Вопрос: GridView после нажатия назад возвращается на первую ячейку

Всем привет
В приложении использован GridView
Имеются 58 категорий, всё работает прекрасно
только вот если зайти на любой из категорий например 50-ый
GridView возвращается на первый уровень
и каждый раз чтобы спуститься вниз надо скролит GridView
как можно сделать так чтобы он оставалься на месте после возврата?
например зашел в 45 категорию нажал кнопку назад выходит на 45-ую категорию.
Спасибо большое.

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="namangan.nisd.uz.rusuzbeksozlashgich.MainActivity">
 
<GridView
        android:id="@+id/gridView"
        android:layout_width="fill_parent"
        android:layout_height="0.0dip"
        android:horizontalSpacing="@dimen/grid_view_horizontal_spacing"
        android:listSelector="@android:color/transparent"
        android:numColumns="@integer/grid_columns"
        android:paddingLeft="@dimen/grid_view_padding_edge"
        android:paddingRight="@dimen/grid_view_padding_edge"
        android:scrollbars="none"
        android:verticalSpacing="@dimen/grid_view_vertical_spacing"
        android:layout_above="@+id/adViewRusAsosiy"
        android:layout_alignParentTop="true" />
    
</RelativeLayout>
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
private GridView gridView; 
this.gridView = ((GridView)findViewById(R.id.gridView)); 
        this.gridView.setNumColumns(3); 
        this.gridView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); 
Ответ: Если вы работаете с Activity, можете почитать здесь

Как менять и получать позиции GridView почитайте здесь
Вопрос: GridLayout

Всем добрый вечер!
Помогите пожалуйста!
Мне нужно программно заполнять GridLayout. Проблема чтобы колонки равномерно заполнили все пространство.
Хочу:

Имею:
Ответ: Паблито, большое спасибо!!!
Универсальная штука

Добавлено через 22 минуты
Сообщение от Паблито
вопрос - в процессе работы программы будут добавляться какие-то вьюшки, которые будут идти в GridLayout в три колонки, количество строк заранее неизвестно
я все правильно понял?
Да, все именно так как я хотела
Вопрос: Обновление gridView

Все привет, как разрешить данную проблему: обновляю gridView, потом поток засыпает на несколько секунд, чтоб пользователь увидел изменение, далее изменяю данные адаптера и снова обновляю gridView. Но gridView отображает только последнюю информацию.
Для примера вот так:
Java
1
2
3
4
5
6
7
8
9
10
for(int i=0;i<4;i++){
                    current.add((byte) 5); //current это ArrayList, который указан в адаптере
                    adapter.notifyDataSetChanged();
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    
 
}
Ожидаю вот такого вывода:сначала 5, потом обновился до 5 5 и т.д
А получаю только конечный результат: 5 5 5 5
Ответ: Ну вот. Как gridView обновится, если главный поток занят
Вопрос: Программное наполнение GridLayout

В цикле заполняю GridLayout картинками. По нажатию на картинку, GridLayout очищается и заполняется новым набором картинок.
Очищаю GridLayout следующим методом:
Код Java(TM) 2 Platform Standard Edition 5.0
1
for(Integer i=0;i<this.contentLayout.getChildCount();i++) this.contentLayout.getChildAt(i).setVisibility(View.GONE);
Возникает следующая проблема:
Допустим у GridLayout задано свойство android:columnCount="4" и необходимо вывести на экран 10 элементов.
При первом выводе на экран все работает нормально:
Х Х Х Х
Х Х Х Х
Х Х _ _
В 3 ряду у нас всего 2 картинки. После очистки GridLayout и заполнения новым набором картинок, заполнение начинается с 3 ячейки:
_ _ Х Х
Х Х Х Х
Х Х Х Х
Подскажите пожалуйста, как программным способом задать для картинки положение в первой ячейке.
Ответ: Спасибо Паблито, это решило мою проблему
Вопрос: Максимально увеличить один элемент в Gridlayout и сжать до минимума остальные

Здравствуйте!
Имеется тестовая разметка:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                      xmlns:app="http://schemas.android.com/apk/res-auto"
                                      android:layout_width="match_parent"
                                      android:layout_height="match_parent"
                                      app:rowCount="4"
                                      app:columncount="4">
 
    <Button
        android:text="1"
        android:id="@+id/button1"
        app:layout_gravity="fill"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        app:layout_row="0"
        app:layout_column="0""/>
 
 
    <Button
        android:text="2"
        android:id="@+id/button2"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        app:layout_gravity="fill"
        app:layout_row="0"
        app:layout_column="1"/>
 
    <Button
        android:text="3"
        android:id="@+id/button3"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        app:layout_gravity="fill"
        app:layout_row="0"
        app:layout_column="2"/>
 
    <Button
        android:text="4"
        android:id="@+id/button5"
        
        app:layout_gravity="fill"
        app:layout_row="1"
        app:layout_column="0"/>
 
    <Button
        android:text="5"
        android:id="@+id/button6"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        app:layout_gravity="fill"
        app:layout_row="1"
        app:layout_column="1"/>
 
    <Button
        android:text="6"
        android:id="@+id/button7"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        app:layout_gravity="fill"
        app:layout_row="1"
        app:layout_column="2"/>
    <Button
        android:text="7"
        android:id="@+id/button8"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        app:layout_gravity="fill"
        app:layout_row="2"
        app:layout_column="0"/>
    <Button
        android:text="8"
        android:id="@+id/button9"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        app:layout_gravity="fill"
        app:layout_row="2"
        app:layout_column="1"/>
 
    <Button
        android:text="9"
        android:id="@+id/button4"
        app:layout_gravity="fill"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        app:layout_row="2"
        app:layout_column="2"
        />
 
</android.support.v7.widget.GridLayout>
(картинка 1)
Хотелось бы добиться того, чтобы кнопка 1 максимально возможно растянулась по высоте, а кнопки 4 и 7 сжались до состояния wrap_content (как на картинке 2, сделал в фоторедакторе).
Не подскажете: как нужно изменить текущую разметку для этого?
Ответ: Ясно
Вопрос: GridLayout размеры кнопок пропорционально весу

Здравствуйте, в GridLayout есть кнопки: как сделать чтобы все кнопки растягивались по горизонтали и вертикали родительского контейнера? Ведь у GridLayout нет свойства weight(вес)?
Ответ: Спасибо
Вопрос: TextEdit выходит за границы экрана в GridLayout

Доброго времени суток.
Делаю такую разметку:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<?xml version="1.0" encoding="utf-8"?>
<GridLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:columnCount="2"
    android:rowCount="9"
    android:padding="4dp"
    android:useDefaultMargins="true"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true">
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/lPu"
            android:padding="4dp"
            android:textSize="17dp"
            android:text="ПУ"/>
 
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="number"
            android:maxLength="3"
            android:padding="4dp"
            android:textSize="17dp"
            android:id="@+id/tPU"
            tools:text="111"
            android:background="@drawable/border_for_textedit"/>
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/lKp"
            android:padding="4dp"
            android:textSize="17dp"
            android:text="КП"/>
 
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="number"
            android:maxLength="3"
            android:padding="4dp"
            android:textSize="17dp"
            android:id="@+id/tKp"
            android:background="@drawable/border_for_textedit"/>
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/lGprsInit"
            android:padding="4dp"
            android:textSize="17dp"
            android:text="GPRS Init"/>
 
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:textSize="17dp"
            android:id="@+id/tGprs_init"
            android:background="@drawable/border_for_textedit"/>
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/lGSMLogin"
            android:padding="4dp"
            android:textSize="17dp"
            android:text="GSM Login"/>
 
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:textSize="17dp"
            android:id="@+id/tGsmLogin"
            android:background="@drawable/border_for_textedit"/>
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/lGsmPassword"
            android:padding="4dp"
            android:textSize="17dp"
            android:text="GSM Password"/>
 
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:textSize="17dp"
            android:id="@+id/tGsmPassword"
            android:background="@drawable/border_for_textedit"/>
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/lVikingLogin"
            android:padding="4dp"
            android:textSize="17dp"
            android:text="Viking Login"/>
 
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:textSize="17dp"
            android:id="@+id/tVikingLogin"
            android:background="@drawable/border_for_textedit"/>
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/lVikingPassword"
            android:padding="4dp"
            android:textSize="17dp"
            android:text="Viking Password"/>
 
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textVisiblePassword"
            android:padding="4dp"
            android:textSize="17dp"
            android:id="@+id/tVikingPassword"
            android:background="@drawable/border_for_textedit"/>
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/lIP"
            android:padding="4dp"
            android:textSize="17dp"
            android:text="Viking IP"/>
 
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:textSize="17dp"
            android:inputType="textFilter"
            android:id="@+id/tVikingIP"
            android:background="@drawable/border_for_textedit"/>
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/lVikingPort"
            android:padding="4dp"
            android:textSize="17dp"
            android:text="Viking Port"/>
 
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:textSize="17dp"
            android:inputType="number"
            android:maxLength="5"
            android:id="@+id/tVikingPort"
            android:background="@drawable/border_for_textedit"/>
 
    </GridLayout>
Все TextEdit`ы во второй колонке выходят за границы экрана. Получается вот такая картина:


Пробовал руками задавать номера строк и столбцов для каждого элемента - не помогло. Пробовал задавать columnWeight. При значении > 0 виджет схлопывается в точку.
Ответ: - я бы делал на TableLayout-е с весами 1 для EditText во втором столбце
- все атрибуты кроме id вынести в стили и применять один стиль для EditText полей и другой для TextView в первой колонке
- все размеры текста задавать в sp а не dp

Добавлено через 15 минут
типа так
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="4dp">
 
        <TableRow>
 
            <TextView
                android:id="@+id/lPu"
                style="@style/first_column"
                android:text="ПУ" />
 
            <EditText
                android:id="@+id/tPU"
                style="@style/second_column"
                android:inputType="number"
                tools:text="111" />
        </TableRow>
 
        <!-- и так далее -->
 
    </TableLayout>
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <style name="first_column">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:padding">4dp</item>
        <item name="android:textSize">17sp</item>
    </style>
 
    <style name="second_column">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_weight">1</item>
        <item name="android:maxLength">3</item>
        <item name="android:padding">4dp</item>
        <item name="android:textSize">17sp</item>
    </style>