Метод Cardslib CardView OnCardClickListener onClick не вызывается

Я использую эту библиотеку в своем приложении: Библиотека карт: Руководство и создал карту, как показано в примере. Теперь мне нужно обработать событие click, но я получаю сообщение об ошибке при создании следующего: new Card.OnCardClickListener, который говорит OnCardClickListener is abstract: cannot be instantiated, В моей деятельности у меня есть этот код:

    Card card = new Card(getBaseContext());//getContext()
    CardHeader header = new CardHeader(getBaseContext());
    card.addCardHeader(header);
    final CardViewNative cardView = (CardViewNative) findViewById(R.id.carddemo);
    cardView.setCard(card);

    cardView.setClickable(true);
    cardView.setOnClickListener(new Card.OnCardClickListener()); //error here

В чем дело? Как я могу установить свою карту как активируемую, а затем обрабатывать события нажатия / касания?

РЕДАКТИРОВАТЬ

Если я использую это так:

cardView.setOnClickListener(new Card.OnCardClickListener(){//error here
        @Override
        public void onClick(Card card, View view) {
            // This will execute when the the card is clicked
        }
    });

это говорит cannot resolve method setOnClickListener(it.gmariotti.cardslib.library.internal.Card.OnCardClickListener)

EDIT1

Вы правы, я установил setOnClickListener на самой карте, и больше нет ошибок, но все равно она не выполняет никаких действий при нажатии на карту. Это новый код:

     //Create a Card
    Card card = new Card(this);//getContext()

    //Create a CardHeader
    CardHeader header = new CardHeader(this);
    //....
    //Add Header to card
    card.addCardHeader(header);

    //Set card in the cardView
    CardViewNative cardView = (CardViewNative) this.findViewById(R.id.carddemo);
    cardView.setCard(card);

    card.setClickable(true);
    card.setOnClickListener(new Card.OnCardClickListener(){
        @Override
        public void onClick(Card card, View view) {
            // This will execute when the the card is clicked
            Toast.makeText(CardMariotti.this,"Clickable card", Toast.LENGTH_LONG).show();
        }
    });

Я выполнил отладку, но onClick метод никогда не вызывается. Как так?

3 ответа

Решение

Card.OnCardClickListener - это интерфейс. Вы должны создать класс, который определяет, как должны использоваться функции в интерфейсе. Попробуй это:

card.setOnClickListener(new Card.OnCardClickListener() {
    @Override
    public void onClick(Card card, View view) {
        // This will execute when the the card is clicked
    }
});

Источник ответов: https://github.com/gabrielemariotti/cardslib/blob/master/doc/CARD.md#clickable-card

Информация об интерфейсах Java: Интерфейсы Java?

РЕДАКТИРОВАТЬ

Кроме того, удалить android:clickable="true" из RelativeLayout, содержащегося в карте. Это крадет клик для себя.

Я нашел ошибку, но я не знаю, как с ней справиться. Это в макете, содержащем карту, cardslib_item_card.xml, Если я удалю все, что я добавил, и я просто оставлю это:

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

тогда на карту нажимают, но если попытаться персонализировать ее, например, добавив Relative Layout, как таковой:

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

    <RelativeLayout android:id="@+id/cardlayout"
        android:layout_width="match_parent" android:layout_height="match_parent"
        android:background="?android:selectableItemBackground"              
        android:clickable="true">
    <!-- layout containing 3 TextViews -->
    </RelativeLayout>
</it.gmariotti.cardslib.library.view.CardViewNative>

тогда карта больше не будет нажата. Чтобы быть более точным, на него нажимают просто иногда, как будто RelativeLayout покрывает всю карту, и когда я нахожу место, где его нет, он обнаруживает мой палец. Это работает, если я только добавляю пустую карту, но как мне тогда ее настроить?

Это как два взгляда друг на друга

Вы должны определить clickListener на card (модель) вместо CardView (Посмотреть)

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

При этом вы должны использовать:

   //it is not necessary if you define a ClickListener on the card
   card.setClickable(true);  

Кстати, вы также должны использовать что-то подобное в Activity:

Card card = new Card(this);
Другие вопросы по тегам