Как вариант - делать кастомный элемент списка и формировать адаптер на основе входных данных. Ну и листенер научить отличать одно от другого.
Как пример (за говнокод сорян :) ):
Как это выглядит:
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="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/imageOrderMenuItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:orientation="vertical">
<TextView
android:id="@+id/tvOrderListItemType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
<TextView
android:id="@+id/tvOrderListItemTitle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMediumInverse" />
<TextView
android:id="@+id/tvOrderListItemText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmallInverse" />
</LinearLayout>
</LinearLayout>
Адаптер:
// имена атрибутов для Map, который используется в отрисовке экрана заказа
public final static String ATTRIBUTE_NAME_TYPE = "type";
public final static String ATTRIBUTE_NAME_TITLE = "title";
public final static String ATTRIBUTE_NAME_TEXT = "text";
public final static String ATTRIBUTE_NAME_ICON = "icon";
// массив имен атрибутов, из которых будут читаться данные
public static final String[] orderListFrom = {
ATTRIBUTE_NAME_TYPE,
ATTRIBUTE_NAME_TITLE,
ATTRIBUTE_NAME_TEXT,
ATTRIBUTE_NAME_ICON
};
// массив ID View-компонентов, в которые будут вставлять данные
public static final int[] orderListTo = {
R.id.tvOrderListItemType,
R.id.tvOrderListItemTitle,
R.id.tvOrderListItemText,
R.id.imageOrderMenuItem
};
public SimpleAdapter getSimpleAdapterForOrderMenu(Context context) {
Map<String, Object> m = new HashMap<>();
menuData.clear();
// Когда
m.put(ATTRIBUTE_NAME_TYPE, OrderMenuItemTypes.WHEN);
m.put(ATTRIBUTE_NAME_TITLE, MAP_ORDER_MENU_ITEM_TYPE_TITLE.get(OrderMenuItemTypes.WHEN));
m.put(ATTRIBUTE_NAME_TEXT, getFormattedOrderDateTime());
m.put(ATTRIBUTE_NAME_ICON, R.drawable.ic_icon_clock);
menuData.add(m);
m = new HashMap<>();
// Откуда
m.put(ATTRIBUTE_NAME_TYPE, OrderMenuItemTypes.FROM);
m.put(ATTRIBUTE_NAME_TITLE, MAP_ORDER_MENU_ITEM_TYPE_TITLE.get(OrderMenuItemTypes.FROM));
if (getFromPoint().getFormattedAddress(true) != null)
m.put(ATTRIBUTE_NAME_TEXT, getFromPoint().getFormattedAddress(true));
else
m.put(ATTRIBUTE_NAME_TEXT, MAP_ORDER_MENU_ITEM_DEF_TEXT.get(OrderMenuItemTypes.FROM));
m.put(ATTRIBUTE_NAME_ICON, R.drawable.ic_icon_start);
menuData.add(m);
m = new HashMap<>();
// Через - опционально
if (getPointsCount() > 2) {
for (int i = 1; i < getPointsCount() - 1; i++) {
m.put(ATTRIBUTE_NAME_TYPE, OrderMenuItemTypes.THROUGH);
m.put(ATTRIBUTE_NAME_TITLE, MAP_ORDER_MENU_ITEM_TYPE_TITLE.get(OrderMenuItemTypes.THROUGH));
if (getOrderPoint(i).getFormattedAddress(false) != null)
m.put(ATTRIBUTE_NAME_TEXT, this.getOrderPoint(i).getFormattedAddress(false));
else
m.put(ATTRIBUTE_NAME_TEXT, MAP_ORDER_MENU_ITEM_DEF_TEXT.get(OrderMenuItemTypes.THROUGH));
m.put(ATTRIBUTE_NAME_ICON, R.drawable.ic_icon_intermediate);
menuData.add(m);
m = new HashMap<>();
}
}
// Куда
m.put(ATTRIBUTE_NAME_TYPE, OrderMenuItemTypes.TO);
m.put(ATTRIBUTE_NAME_TITLE, MAP_ORDER_MENU_ITEM_TYPE_TITLE.get(OrderMenuItemTypes.TO));
if (getToPoint().getFormattedAddress(false) != null)
m.put(ATTRIBUTE_NAME_TEXT, getToPoint().getFormattedAddress(false));
else
m.put(ATTRIBUTE_NAME_TEXT, MAP_ORDER_MENU_ITEM_DEF_TEXT.get(OrderMenuItemTypes.TO));
m.put(ATTRIBUTE_NAME_ICON, R.drawable.ic_icon_finish);
menuData.add(m);
m = new HashMap<>();
// Дополнительно
m.put(ATTRIBUTE_NAME_TYPE, OrderMenuItemTypes.EXTRA);
m.put(ATTRIBUTE_NAME_TITLE, MAP_ORDER_MENU_ITEM_TYPE_TITLE.get(OrderMenuItemTypes.EXTRA));
m.put(ATTRIBUTE_NAME_TEXT, getOrderExtraInfo());
m.put(ATTRIBUTE_NAME_ICON, R.drawable.ic_icon_options);
menuData.add(m);
// создаем адаптер
return new SimpleAdapter(
context,
menuData,
R.layout.order_list_item,
orderListFrom,
orderListTo);
}
Обработчик нажатия на список:
// Обработчик нажатия на меню
lvOrder.setOnItemClickListener(
new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
OrderConst.OrderMenuItemTypes selectedMenuItemType = (OrderConst.OrderMenuItemTypes) ((HashMap) adapterView.getAdapter().getItem(i)).get(OrderConst.ATTRIBUTE_NAME_TYPE);
Gson gson = new Gson();
switch (selectedMenuItemType) {
case WHEN:
//Выбрали пункт "Когда"
//Открываем диалог с выбором - сейчас, сегодня, завтра
SingleChoiceDialogFragment dialog = new SingleChoiceDialogFragment();
Bundle bundle = new Bundle();
bundle.putString(SingleChoiceDialogFragment.ID, OrderConst.SINGLE_CHOICE_DIALOG_TYPE_TIME);
bundle.putString(SingleChoiceDialogFragment.TITLE, "Когда нужно подать машину?");
bundle.putStringArray(SingleChoiceDialogFragment.DATA, OrderConst.orderTimeList);
bundle.putInt(SingleChoiceDialogFragment.SELECTED, newOrder.getOrderDateMoment());
dialog.setArguments(bundle);
dialog.show(getSupportFragmentManager(), "WhenDialog");
break;
case EXTRA:
//Выбрали пункт "Дополнительно"
//Открываем окно выбора доп опций заказа
Intent orderExtra = new Intent(getApplicationContext(), OrderExtraActivity.class);
orderExtra.putExtra(GlobalConst.INTENT_KEY_ORDER, gson.toJson(newOrder));
startActivityForResult(orderExtra, OrderConst.REQUEST_CODE_ORDER);
break;
default:
// Выбрали какой-то из пунктов "Откуда", "Через", "Куда"
int idx = (i - 1 < 0) ? 0 : i - 1;
Intent orderAddressChoose = new Intent(getApplicationContext(), OrderAddressActivityTabs.class);
orderAddressChoose.putExtra(GlobalConst.INTENT_KEY_ADDRESS, gson.toJson(newOrder.getOrderPoint(idx)));
startActivityForResult(orderAddressChoose, OrderConst.REQUEST_CODE_ADDRESS);
break;
}
}
}