Самый простой способ - использовать макет xml для своих элементов и использовать адаптер, чтобы накачать этот элемент, а затем изменить его содержимое:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null){
// Create new view
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.item, parent, false);
}
// Set information
TextView titleView = (TextView)convertView.findViewById(R.id.title);
titleView.setText(data.get(position).title);
TextView otherView = (TextView)convertView.findViewById(R.id.other);
titleView.setText(data.get(position).other);
return convertView;
}
Когда convertView имеет значение null, вы создаете новый, а затем в каждом случае повторно используете это представление. 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="wrap_content">
<TextView android:id="@+id/title" android:layout_width="fill_parent"
android:layout_height="match_parent" />
<TextView android:id="@+id/other" android:layout_width="fill_parent"
android:layout_height="match_parent" />
</LinearLayout>
Это можно дополнительно оптимизировать, сохранив ссылку на инфлятор и используя систему тегов вида для отслеживания внутренних видов, но это немного не по теме ... Если вы хотите узнать больше об этом, я рекомендую Конференция Google IO Мир ListView