Как правильно настроить карты с помощьюcardslib?

У меня карта объявлена ​​в файле cardslib_item_card_view:

<it.gmariotti.cardslib.library.view.CardViewNative     
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:card="http://schemas.android.com/apk/res-auto"
  xmlns:card_view="http://schemas.android.com/apk/res-auto"
  card_view:cardCornerRadius="4dp"
  style="@style/native_recyclerview_card.base"
  android:id="@+id/carddemo"
  android:layout_width="match_parent" android:layout_height="wrap_content">

и установить как представление содержимого в методе onCreate():

public class CardMariotti extends ActionBarActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.cardslib_item_card_view);
        //Create a Card
        Card card = new Card(this);
        CardViewNative cardView = (CardViewNative) this.findViewById(R.id.carddemo);
        cardView.setCard(card);

        card.setOnClickListener(new Card.OnCardClickListener() {
            @Override
            public void onClick(Card card, View view) {
                Toast.makeText(CardMariotti.this, "Clickable card", Toast.LENGTH_LONG).show();
            }
        });
}

Теперь я хотел бы настроить его с помощью собственного макета, содержащего узкий заголовок и некоторую информацию, как показано ниже:

<RelativeLayout  android:id="@+id/cardlayout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:background="?android:selectableItemBackground"    
    android:clickable="true">

    <!-- layout containing 3 TextView -->
</RelativeLayout> 

Какова каноническая процедура для такого процесса? Я пробовал много настроек, т.е.:

  • создание второго XML-файла с именем cardslib_item_layout.xml и ссылка на него с помощью конструктора Card следующим образом: Card card = new Card(this, R.layout.cardslib_item_layout);, а затем установка setContentView(R.layout.cardslib_item_card_view)
  • Добавление макета внутри карты, а затем установка setContentView(R.layout.cardslib_item_card_view).

Сюда; cardslib_item_card_view:

<it.gmariotti.cardslib.library.view.CardViewNative     
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:card="http://schemas.android.com/apk/res-auto" 
      xmlns:card_view="http://schemas.android.com/apk/res-auto"
      card_view:cardCornerRadius="4dp"
      android:id="@+id/carddemo"
      android:layout_width="match_parent" android:layout_height="wrap_content">

      <RelativeLayout>
          <!-- my layout containing a header and some TextViews -->
      </RelativeLayout>
</it.gmariotti.cardslib.library.view.CardViewNative>

В обоих тестах я испытываю следующие проблемы:

  • Общий результат полностью искажен
  • самое главное, RelativeLayout размещается НАВЕРХУ карты, что делает невозможным любое действие с картой (например, установка Card.OnCardClickListener на самой карте не будет работать, так как пользователь будет щелкать RelativeLayout, а не саму карту)

попытка 1: введите здесь описание изображенияпопытка 2: введите здесь описание изображения

Что такое каноническая процедура?

EDIT2: ОТВЕТ

Вклад, предоставленный @Msk, отлично сработал для меня, хотя позже я обнаружил, что с некоторыми незначительными изменениями также можно получить те же результаты, используя класс Card исходной библиотеки карт, не прибегая к созданию нового класса DeviceCard, расширяющего Card учебный класс.

Я смог настроить свой макет (заголовок и остальная часть макета карты перекрываются друг с другом, как показано на скриншотах) с небольшими и тривиальными изменениями в файле cardslib_item_layout.xml (которые я упустил из виду раньше); в то же время я смог устранить фантомное дополнение, которое автоматически прикрепляется к каждой карте, применив ответ Мариотти к этот вопрос.


person Cris    schedule 01.05.2015    source источник


Ответы (1)


Попробуйте это
Вы можете определить свой собственный макет для библиотеки карт.

Создайте свой собственный XML:

Вот пример custom_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="8dp"
    android:paddingRight="6dp"
    android:paddingTop="7dp"
    android:paddingBottom="7dp"
    android:id="@+id/parentView">


    <TextView
        android:id="@+id/name"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_weight="27"
        android:paddingRight="8dp"
        android:paddingLeft="8dp"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        android:text=""
        android:layout_gravity="center"
        android:editable="false"
       />

</LinearLayout>

В вашем коде JAVA создайте класс для пользовательской карты, которую вы хотите использовать:

    import it.gmariotti.cardslib.library.internal.Card;
    import it.gmariotti.cardslib.library.internal.ViewToClickToExpand;

public class DeviceCard extends Card {

        private String IP;
        private String MAC;
        private String name;
        private Boolean reachable;
        private Boolean editable;
        Boolean markedFlag;

        public DeviceCard(Context context) {
            this(context, R.layout.custom_layout);
        }

        public DeviceCard(Context context,String param1,...,Type paramn) {

            this(context, R.layout.device_card);
            this.name = param1;
        }



        public DeviceCard(Context context, int innerLayout) {
            super(context, innerLayout);
            init();
            Log.d("myTag", "Init called");
        }


        private void init(){


        }

        @Override
        public void setupInnerViewElements(ViewGroup parent, final View view)          {
            Log.i("myTag","setupInnerView");

            final TextView nameBox = (TextView)view.findViewById(R.id.name);
          //edit name if required

        }
    }

Теперь в вашем коде JAVA, когда вам нужно использовать список карт:

DeviceCard card = new DeviceCard(this, name);

Этот метод всегда работал для меня

person Msk    schedule 01.05.2015
comment
Я точно не знаю, что произошло, так это то, что макет выглядит так же, как мой первый скриншот, а RelativeLayout втиснут в меньший прямоугольник! Я полагаю, что сделал так, как вы сказали мне, но, возможно, я несколько ошибся в вашем примере? - person Cris; 01.05.2015
comment
вам не нужно делать то, что вы делали раньше. Удалите их полностью и проверьте один раз - person Msk; 02.05.2015
comment
он работает после небольшой настройки моего внутреннего макета (= общая структура остается неизменной); но есть кое-что еще! внутренний макет, похоже, никогда не совпадает с макетом карты CardRecyclerView. Это означает, что он показывает, как будто я добавляю отступы во всех направлениях, но я этого не делал! Ты знаешь почему? Я могу опубликовать более подробную информацию, если они вам нужны! - person Cris; 02.05.2015
comment
Да, потому что определенный макет базовой карты имеет некоторые отступы. Возможно, вы в первую очередь получаете больше отступов внизу? Верно. Просто опубликуйте новое изображение того, что вы получаете сейчас. Может быть, я могу быть более полезным ;-) - person Msk; 02.05.2015
comment
Я нашел решение этой последней проблемы со скрытым дополнением, переопределив значения размеров, как описано здесь: stackoverflow.com/questions/29134528/ Спасибо за вашу помощь. - person Cris; 02.05.2015