Android ListView с 2 текстовыми элементами на элемент

Все примеры, которые я видел в сети, содержат только 1 TextView для каждого элемента, и они загружают данные из массива. Я не понимаю, как указать, какие данные идут туда. Например, мой макет элемента выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/receiver" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

Как сохранить данные в массиве, чтобы его можно было использовать в ListView с этим макетом?

Наверное, ты не выглядел тяжело. 🙂 Там есть множество примеров, которые показывают вам, как это сделать. Найдите «Custom ListView Android», и вы получите довольно много.

Один из них здесь. http://techdroid.kbeanie.com/2009/07/custom-listview-for-android.html

Вот адаптер пользовательского списка:

 private class ListAdapter extends ArrayAdapter<RSSItem> { private List<Item> items; public ListAdapter(Context context, int textViewResourceId, List<Item> items) { super(context, textViewResourceId, items); this.items = items; } public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.list_item, null); } Item item = items.get(position); if (item != null) { TextView title = (TextView) v.findViewById(R.id.tvTitle); TextView description = (TextView) v.findViewById(R.id.tvDescription); if (title != null) { title.setText(item.getTitle()); } if (description != null) { description.setText(item.toString()); } } return v; } } 

Это класс Item , ведьма будет хранить ваши данные:

 public class Item { private String title = null; private String description = null; RSSItem() { } public void setTitle(String title) { this.title = title; } public void setDescription(String description) { this.description = description; } public String getTitle() { return title; } public String getData() { return data; } } 

… и вот класс, с помощью которого вы можете взять все данные списка в каком-то массиве:

 public class ListData { private int itemcount = 0; private List<Item> itemlist; ListData () { itemlist = new Vector<Item>(); } int addItem(Item item) { itemlist.add(item); itemcount++; return itemcount; } Item getItem(int location) { return itemlist.get(location); } List<Item> getAllItems() { return itemlist; } int getItemCount() { return itemcount; } } 

В вашем основном классе ( Activity ) вы должны правильно заполнить свои данные.

С адаптером вы подаете список с данными. И когда вы используете метод getView (), вы добавляете данные в эти текстовые элементы. Там тысячи примеров в сети …

Вот один пример (улучшения в этом коде могут быть сделаны, конечно)

  @Override public View getView(int position, View convertView, ViewGroup parent) throws NullPointerException { ViewHold viewHold; if (convertView == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = vi.inflate(R.layout.temp2, null); viewHold = new ViewHold(); viewHold.go = (Button)convertView.findViewById(R.id.gotherefav); viewHold.remove = (Button)convertView.findViewById(R.id.removefav); convertView.setTag(viewHold); } else { viewHold=(ViewHold)convertView.getTag(); } String t = items.get(position); if (t != null) { TextView itemText = (TextView) convertView.findViewById(R.id.item); // here you add data from arrayLists TextView itemText2 = (TextView) convertView.findViewById(R.id.item2); itemText2.setText(t); itemText.setText(t); itemText.invalidate(); } viewHold.go.setVisibility(View.GONE); viewHold.remove.setVisibility(View.GONE); return convertView; } }