Как управлять GridView
у меня есть следующий код для Gridview (чтобы сделать календарь).
<GridView
android:id="@+id/calendar"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/rl1"
android:layout_below="@+id/ll2"
android:columnWidth="250dp"
android:numColumns="7" >
</GridView>
Grid_Cell выглядит следующим образом.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/calendar_button_selector" >
<Button
android:id="@+id/calendar_day_gridcell"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/calendar_button_selector"
android:gravity="center"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="#000"
android:textSize="14.47sp" >
</Button>
<TextView
android:id="@+id/num_events_per_day"
style="@style/calendar_event_style"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center" >
</TextView>
Я не хочу устанавливать пробел между строками и столбцами.
существующее представление выглядит следующим образом.
пожалуйста, помогите мне... Спасибо заранее .
5 ответов
Я попытаюсь дать вам фрагмент, но, честно говоря, нет смысла использовать GridView для вашего случая, так как все ваши элементы все равно есть на экране. Вы можете создать пару LinearLayout
s в небольшом цикле, который получит результат.
Я бы посоветовал вам установить columnWidth во время выполнения в соответствии с шириной экрана.
и ваш адаптер должен питаться шириной и высотой столбца, чтобы установить их при раздувании дочерних представлений. И в этом случае, вам нужно чтобы избавиться от numColumns. Помните, что использование numColumns вместе с columnWidth не имеет смысла, особенно когда вы хотите заполнить все пространство. Если вы хотите установить numColumns, удалите columnWidth.
решение:
вот результат:
Сначала мы создаем макет. В моем случае, это
MainActivity
макет и называется activity_main.xml
. (Обратите внимание, что нет GridView, потому что я добавлю это позже в коде):
<RelativeLayout 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"
tools:context=".MainActivity" >
<TextView
android:id="@+id/header"
android:background="#444"
android:gravity="center"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@android:color/white"
android:text="Dynamic Static GridView" />
<TextView
android:id="@+id/footer"
android:gravity="center"
android:background="#444"
android:textColor="@android:color/white"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Shush" />
</RelativeLayout>
наши Макет элемента GridView находится здесь, в item_grid.xml
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="#fff"
android:layout_height="match_parent" >
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
теперь трюк находится в MainActivity (я прокомментировал некоторые из кода, чтобы вы поняли):
пакета com.образец.dynamicstaticgridview;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.RelativeLayout;
import android.app.Activity;
import android.graphics.Color;
/**
* @author Sherif elKhatib
*
*/
public class MainActivity extends Activity {
private static String items[]; //these are temporary items :p do not use them
static {
items = new String[7*7];
for(int i=0;i<7*7;i++) {
items[i] = String.valueOf(i);
}
}
int numberOfColumns = 7; //defaulting to 7, you can change it when you know
int numberOfRows = 7; //defaulting to 7, you can change it when you know
GridView mGrid;
ArrayAdapter<String> mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
params.addRule(RelativeLayout.BELOW, R.id.header);
params.addRule(RelativeLayout.ABOVE, R.id.footer);
mGrid = new GridView(this) {
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if(!calculated)
getDimens();
}
};
mGrid.setVerticalSpacing(0);
mGrid.setHorizontalSpacing(0);
mGrid.setStretchMode(GridView.NO_STRETCH);
mGrid.setBackgroundColor(Color.rgb(100, 10, 10));
((RelativeLayout)findViewById(R.id.rootview)).addView(mGrid, params);
}
private int mCellWidth;
private int mCellHeight;
boolean calculated = false;
protected void getDimens() {
calculated = true;
//here you might have some rounding errors
//thats why you see some padding around the GridView
mCellWidth = mGrid.getWidth()/numberOfColumns;
mCellHeight = mGrid.getHeight()/numberOfRows;
mGrid.setColumnWidth(mCellWidth);
mGrid.setNumColumns(numberOfColumns);
mAdapter = new ArrayAdapter<String>(this, R.layout.item_grid, R.id.text, items) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
GridView.LayoutParams params = null;
if(convertView == null) {
params = new GridView.LayoutParams(mCellWidth, mCellHeight);
}
convertView = super.getView(position, convertView, parent);
if(params != null) {
convertView.setLayoutParams(params);
}
return convertView;
}
};
mGrid.setAdapter(mAdapter);
}
}
комментарии:
Вам действительно лучше найти достойный алгоритм для выбора mCellWidth
, mCellHeight
, numberOfColumns
и numberOfRows
.
Я могу ошибаться, но насколько я знаю GridView
это AdapterView
, что в вашем случае означает, что вы не можете динамически, через xml, форматировать высоту ваших элементов таким образом, чтобы они всегда заполняли весь родитель. Это не то, как работают представления сетки (и представления списка и другие представления адаптера).
такие "прокручиваемые виды контейнеров" можно рассматривать как читателей микрофильмов который существовал в" современных библиотеках " очень долгое время тому назад. Нужно понимать, что данные действительно не имеют ничего общего с фактическим зрителем, вы просто используете свой зритель (GridView
в вашем случае) с фиксацией и высотой для панорамирования элементов данных подложки, которые также имеют свои фиксированные ширины и высоты.
как я вижу, вы пытаетесь явно нацелиться на тот самый угловой случай, когда данные просто имеют тот же геометрический размер, что и ваше окно просмотра.
несколько советов, хотя:
можно посмотреть GridLayout
. The GridLayout
вводится в API level 14 (Icecream Sandwich), поэтому вам, возможно, придется пересмотреть свою стратегию поддержки версий (если я не полностью ошибаюсь, он также должен быть включен в пакет поддержки V7 для обратной совместимости на старых платформах, в этом случае вы можете просто добавить банку в свое приложение для поддержки старых уровней API).
еще один совет будет использовать TableLayout
с соответствующими строками таблицы, а что нет. The TableLayout
существует с первого дня, поэтому там нет проблем с обратной совместимостью, но они, как правило, становятся очень интенсивными. Если вы планируете перезагрузить свой вид много или прокручивать между месяцами плавно, я не уверен, что это решение для вас (из-за количества глубоких маршрутов компоновки).
третьим решением было бы то, что вы все еще используете GridView
, но мерять высота его и динамически установить высоту фиксации для ваших надутых элементов сетки из вашего адаптера сетки, на основе измеренного GridView
высота (другими словами: вы убедитесь, что вы вводите вышеупомянутый угловой корпус).
если вы используете GridView
вам также нужно избавиться от вертикального расстояния. Есть на GridView
Что вы могли бы поиграйте с. Вы также можете попробовать разные (отрицательные?) размеры на android:verticalSpacing
атрибут.
удачи с пользовательским видом календаря!
Если вы хотите дать высоту и ширину вашему gridview, поместите относительный макет вне gridview и дайте android:layout_width и android:layout_height вашему относительному макету. Затем укажите ширину и высоту gridview для match_parent. После этого, если вы хотите дать точную высоту и ширину элементам ячейки gridview, сначала вы должны знать точную ширину и высоту всех ячеек, и вы должны определить ширину столбца в соответствии с этим, например, для этого кода
<GridView
android:id="@+id/calendar"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/rl1"
android:layout_below="@+id/ll2"
android:columnWidth="250dp"
android:numColumns="7" >
</GridView>
Если у вас нет макета 1000dp снаружи, вы никогда не получите 4 ячейки в одной строке в хорошем виде, но только gridview попытается определить свою собственную ширину ячейки.
для вашей ситуации ваш календарь gridview должен быть чем-то вроде этого:
<GridView
android:id="@+id/calendar"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/rl1"
android:layout_below="@+id/ll2"
android:columnWidth="50dp"
android:numColumns="7" >
</GridView>
кажется, это решение для вас http://www.anddev.org/how_to_display_gridview_with_gridlines_and_borders-t11099.html
попробуйте установить эти два значения в XML для GridView
:
android:horizontalSpacing="0dp"
android:verticalSpacing="0dp"
вы, вероятно, захотите удалить