У меня проблемы с моим GridView. Прежде всего, он посещает последние строки, если элементы слишком взят. Забавно, что я вычисляю их высоту в getView()
пользовательского адаптера, который я использую. Я просто хочу, чтобы GridView отображал 5 строк, высота которых зависит от его высоты. Распечатка родительской высоты и дневной высоты на консоль дает правильные значения.Android GridView убирает предметы и не обновляет их должным образом
Класс адаптера:
public View getView(int position, View convertView, ViewGroup parent) {
View day = convertView;
if (day == null) {
day = inflater.inflate(R.layout.calendar_day_gridcell, parent, false);
}
int dayHeight = parent.getHeight()/5; // month can spread over at most 5 weeks
TextView tvDay = (TextView) day.findViewById(R.id.calendar_grid_cell);
tvDay.setHeight(dayHeight);
// set text and background colour of tvDay depending on position
}
XML Layout для фрагмента, который содержит GridView
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<
TextView />
<LineaLayout /> <!-- horizontal layout with 7 children -->
<GridView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.0"
android:id="@+id/calendar_grid"
android:numColumns="7"/>
</LinearLayout>
Кроме того у меня есть проблема, что в зависимости от положения я установить определенный цвет текста для ячейки сетки.
Итак, я хочу, чтобы все элементы с position < X1
имели синий текст, остальные - красные. Когда я создаю новый набор данных (выполняется в публичной функции-члене, в которой вызывается notifyDataSetChanged()
) и X2 < X1
, тогда все элементы с position < X1
имеют синий текст, хотя некоторые из них должны иметь красный текст (а именно те, которые имеют позицию X1 - X2
). Однако цвет фона установлен правильно. Есть идеи?
EDIT
я узнал, что подрезание было вызвано android.support.design.widget.CoordinatorLayout
. Я создал проект с AndroidStudio и создал файл activity_main.xml с указанным макетом. Изменение его на LinearLayout устранило проблему обрезки. Однако вторая проблема остается.
Весь смысл GridView заключается в том, что он будет прокручивать ваши элементы, если они окажутся больше, чем могут поместиться на дисплее. Если вы не хотите прокручивать и вместо этого просто хотите двухмерный набор представлений, почему бы вам не использовать GridLayout? –
@DougStevenson Причина GridView имеет OnItem (Long) ClickListener, который, afaik, GridLayout не имеет? И я думал, что GridView более эффективен, поскольку он повторно использует макеты? Не может быть большой сделки, так как я показываю только 32 элемента, но все же. Кроме того, мой GridView даже не прокручивается, пока я не увижу последнюю строку полностью. Он просто отсекает последние предметы. – Ricky