Cardslib的CardView OnCardClickListener的onClick方法未被调用

时间:2015-04-28 17:28:31

标签: android android-layout android-recyclerview android-cardview cardslib

我在我的应用中使用此库:Card Library : Guide并创建了一张卡片,如示例所示。 现在我需要处理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 个答案:

答案 0 :(得分: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 Interfaces?

修改

此外,从卡中包含的RelativeLayout中删除android:clickable="true"。它为自己窃取了点击次数。

答案 1 :(得分:2)

我发现错误但我不知道如何处理它。 它位于包含卡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">

然后卡被点击,但如果尝试个性化它,例如添加相对布局,如下:

<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覆盖了整张卡片,而当我找到一个不存在的地方时,它会检测到我的手指。如果我只添加一张空卡,它可以工作,但我该如何定制呢?

这就像在彼此之上有两个视图

答案 2 :(得分:1)

您必须在card(模型)上定义clickListener而不是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);