GridView с различными размерами столбцов
Попытка создать список рекордов, который можно прокручивать, и выглядит так:
foo 1000
bar 876
foobar 500
foobarfoo 1
В настоящее время я делаю это с GridView. Я хотел бы установить ширину столбца имени на 60% экрана и ширину столбца оценки на 40%. Является ли это возможным?
В настоящее время я пытаюсь с помощью адаптера костюма. Вот функция getview для этого:
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv;
if (convertView == null) {
tv = new TextView(context);
tv.setTextSize(25);
tv.setTextColor(Color.WHITE);
if (position % 2 == 0)
{
tv.setLayoutParams(new GridView.LayoutParams((width/10)*6, 50));
}
else
{
tv.setLayoutParams(new GridView.LayoutParams((width/10)*4, 50));
}
}
else {
tv = (TextView) convertView;
}
tv.setText(texts[position]);
return tv;
}
Макет построен по сетке и кнопке внизу. XML-файл:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/top">
<GridView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:id="@+id/grid"
android:numColumns="2"
android:columnWidth="0dp"
>
</GridView>
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/backbutton" android:text="@string/backstr"></Button>
</LinearLayout>
Итак, вопрос снова: можно ли настроить GridView, чтобы разрешить добавление столбцов разных размеров? Если да, то мой подход хорош? (Наверное, нет, так как он не работает:)) Я что-то пропустил?
Заранее спасибо!
2 ответа
Работать как шарм! Большое спасибо Абхинаву, который дал хороший совет. Вот код для всех, у кого такая же проблема:
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv1;
TextView tv2;
LinearLayout ll;
if (convertView == null) {
tv1 = new TextView(context);
tv1.setTextSize(25);
tv1.setTextColor(Color.WHITE);
tv1.setGravity(Gravity.LEFT);
tv1.setPadding(5, 5, 5, 5);
tv1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT,
(float) 3.0));
tv2 = new TextView(context);
tv2.setTextSize(25);
tv2.setTextColor(Color.WHITE);
tv2.setGravity(Gravity.RIGHT);
tv2.setPadding(5, 5, 5, 5);
tv2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT,
(float) 4.0));
ll = new LinearLayout(context);
ll.setOrientation(0);
ll.setPadding(5, 5, 5, 10);
tv1.setText(names[position]);
tv2.setText(scores[position]);
ll.addView(tv1);
ll.addView(tv2);
}
else {
ll = (LinearLayout) convertView;
tv1 = (TextView) ll.getChildAt(0);
tv2 = (TextView) ll.getChildAt(1);
tv1.setText(names[position]);
tv2.setText(scores[position]);
}
return ll;
}
И файл XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/top">
<ListView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:numColumns="2"
android:columnWidth="0dp"
android:id="@+id/list">
</ListView>
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/backbutton" android:text="@string/back"></Button>
</LinearLayout>
Если вы думаете, что можете улучшить этот код (так как я новичок в этой области), не стесняйтесь, ответьте! Заранее спасибо!
Мы должны были сделать это для проекта и не хотели использовать ничего, кроме GridView
потому что функциональность была повторена, но на одном GridView
нам нужна была немного другая конфигурация представления (но все еще использующая адаптер и все другие хорошие вещи). Мы обнаружили, что вы МОЖЕТЕ сделать это, если переопределите GridView
"s layoutChildren
функция, хотя это довольно плохо документировано.
Наша реализация имеет проверку для специального представления и для того, если новый макет уже был реализован:
@Override
protected void layoutChildren(){
super.layoutChildren();
if(!isSpecial || layoutAlreadySet) return;
layoutAlreadySet = true;
//Implement special layout....
}