a13xsus
@a13xsus
Lazy developer

Как удобнее реализовать в XML такой layout?

18a7bc06d6804bd18f646bb04ddcda42.jpg

Каждый блок контактов (строка) кликабелен. Как удобнее реализовать в XML этот layout? Интересуют только блок контактов. Просто через LinearLayout набросать Button с иконкой +2 textview на один контакт или есть более гуманные виджеты?
  • Вопрос задан
  • 220 просмотров
Решения вопроса 1
@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;
                        }

                    }
                }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы