Я борюсь с RecyclerView. Я использую просмотр recycler для отображения деталей моего класса модели.
//My model class
MyModel {
String name;
Double latitude;
Double longitude;
Boolean isOnline;
...
}
Так как некоторые из значений могут отсутствовать, я использую RecyclerView с настраиваемыми типами представлений (один из которых представляет каждое значение моей модели).
//Inside my custom adapter
public void setModel(T model) {
//Reset values
itemCount = 0;
deviceOfflineViewPosition = -1;
mapViewPosition = -1;
//If device is offline, add device offline item
if (device.isOnline() == null || !device.isOnline()) {
deviceOfflineViewPosition = itemCount;
itemCount++;
}
//Add additional items if necessary
...
//Always add the map as the last item
mapViewPosition = itemCount;
itemCount++;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if (position == deviceOfflineViewPosition) {
return ITEM_VIEW_TYPE_OFFLINE;
} else if (position == mapViewPosition) {
return ITEM_VIEW_TYPE_MAP;
} else if (...) {
//Check for other view types
}
}
С RecyclerView я могу легко определить во время выполнения, какие значения доступны и добавить соответствующие элементы в источник данных RecyclerView. Я просто использовал код, но моя модель имеет гораздо больше значений, и у меня есть намного больше типов просмотров.
Последний элемент в RecyclerView всегда является картой и всегда присутствует. Даже если в моей модели нет никакой ценности, по крайней мере будет один элемент, карта.
ПРОБЛЕМА. Как я могу сделать последний элемент в RecyclerView заполнить оставшееся пространство на экране, а также получить минимальное значение. Размер должен быть тем, что когда-либо стоило: оставшееся пространство или минимальная высота. Например:
- Модель имеет несколько значений, которые в сумме занимают 100dp экрана 600dp → высота карты должна быть 500dp
- Модель имеет множество значений, которые в сумме занимают 500dp экрана 600dp → map heigh должно быть минимальным значением 200dp
- Модель не имеет значений → карта заполняет весь экран