Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (5)

Наибольший вклад в теги

Все теги (16)

Лучшие ответы пользователя

Все ответы (8)
  • Как удобнее реализовать в XML такой layout?

    @ape364
    Как вариант - делать кастомный элемент списка и формировать адаптер на основе входных данных. Ну и листенер научить отличать одно от другого.

    Как пример (за говнокод сорян :) ):

    Как это выглядит:

    dd7030dc4f30465fba19dab8a8432a10.jpg

    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;
                            }
    
                        }
                    }
    Ответ написан

Лучшие вопросы пользователя

Все вопросы (7)