#android #list
#Android #Список
Вопрос:
Мне нужно создать более продвинутый список в моем приложении для Android, который будет содержать более одной строки на элемент. На самом деле, я ищу что-то похожее на представление «встречи» в приложении «Календарь»: я хочу разделить свои элементы по дням и показать что-то похожее на время встречи.
Не представляю, как это сделать, хотя, я предполагаю, что это невозможно с помощью ListActivity?
Что вы, ребята, предлагаете?
Редактировать: Если бы кто-нибудь мог привести пример кода, я был бы очень признателен, я не уверен, как выполнить то, что было предложено в текущих ответах..
Ответ №1:
Это легко выполнимо с помощью ListActivity. Вам нужно создать внутри него подкласс, который расширяет ArrayAdapter (или любой другой адаптер списка) и переопределяет его метод getView(). Вы захотите создать XML-файл, определяющий «вид» для каждого элемента списка. Затем в вашем переопределенном методе getView () вам нужно будет расширить это представление, а затем использовать findViewById() для каждого из элементов, которым вы хотите присвоить значение.
public class YourListActivity extends ListActivity {
private String[] values = new String[]{"Row 1", "Row 2", "Row 3"};
private class Adapter extends ArrayAdapter<String> {
private LayoutInflater li = LayoutInflater.from(this.getContext());
public Adapter() {
super(YourListActivity.this, 0, values);
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
View v = li.inflate(R.layout.row, parent);
TextView field1 = (TextView) v.findViewById(R.id.field1);
field1.setText(values[position]);
return v;
}
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setListAdapter(new Adapter());
}
}
row.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@ id/field1"
/>
</LinearLayout>
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@android:id/list"
/>
</LinearLayout>
Вы можете дополнительно изменить внешний вид строки и содержащихся в ней полей, добавив дополнительные текстовые представления в row.xml и, используя position
переданный через к getView()
, устанавливайте значения ваших дополнительных полей соответствующим образом, и вы даже можете настраивать строки по порядку, если вам нужно.
Комментарии:
1. Привет, спасибо за вашу помощь. Однако с кодом есть несколько проблем, это
View v = li.inflate(R.layout.row, parent);
не работает..2. Ах, моя ошибка, я думал о CursorAdaptor, который вы могли бы легко переопределить. Это немного сложнее, если вы получаете данные не из курсора, вам нужно расширить BaseAdapter согласно этой ссылке: developer.android.com/resources/samples/ApiDemos/src/com/… Но мне интересно, не следует ли вам вместо этого подумать о расширяемом списке с категориями в виде дней. От того, откуда вы получаете данные, зависит, какой адаптер вы переопределяете. Откуда будут поступать данные об этих встречах? База данных SQLite приложения на телефоне? Или другое приложение? Или..
Ответ №2:
Это записанное выступление от Google I / O в прошлом году объясняет, что вы хотите знать:http://www.google.com/events/io/2010/sessions/world-of-listview-android.html
Ответ №3:
Создайте ListAdapter. Это класс, отвечающий за предоставление списка с элементами пользовательского интерфейса. С помощью getView вы можете создавать любые представления, которые вам нравятся. Если у вас есть несколько типов элементов списка, будьте осторожны, чтобы не использовать повторно convertView, который получает getView.
Комментарии:
1. Нет, всегда повторно используйте convertView, который получает getView. Если у вас есть элементы более одного типа, используйте предоставленные механизмы интерфейса адаптера, чтобы сообщить о них вашему ListView:
int getItemViewType(int)
иint getViewTypeCount()
.