Shumin
Shumin

Reputation: 991

Android Tinder like swipeable-card setOnCardDismissedListener

I am trying to make a tinder-like swipeable-card. I have this library https://github.com/kikoso/Swipeable-Cards. I followed the demo and it works fine. However, the demo only has one cardModel to be setoncarddismissedlisterner. How can I have all cardModels in the adapter work? I wanna get every cardModel's info (e.g. Title, text) after it's dismissed

private CardContainer mCardContainer;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.mainlayout);

    mCardContainer = (CardContainer) findViewById(R.id.layoutview);

    Resources r = getResources();

    SimpleCardStackAdapter adapter = new SimpleCardStackAdapter(this);

    adapter.add(new CardModel("Title1", "Description goes here", r.getDrawable(R.drawable.picture1)));
    adapter.add(new CardModel("Title2", "Description goes here", r.getDrawable(R.drawable.picture2)));
    adapter.add(new CardModel("Title3", "Description goes here", r.getDrawable(R.drawable.picture3)));
    adapter.add(new CardModel("Title4", "Description goes here", r.getDrawable(R.drawable.picture1)));
    adapter.add(new CardModel("Title5", "Description goes here", r.getDrawable(R.drawable.picture2)));
    adapter.add(new CardModel("Title6", "Description goes here", r.getDrawable(R.drawable.picture3)));
    adapter.add(new CardModel("Title1", "Description goes here", r.getDrawable(R.drawable.picture1)));

    CardModel cardModel = new CardModel("Title1", "Description goes here", r.getDrawable(R.drawable.picture1));
    String title = cardModel.getTitle();
    cardModel.setOnClickListener(new CardModel.OnClickListener() {
       @Override
       public void OnClickListener() {
           Log.i("Swipeable Cards","I am pressing the card");
       }
    });

    cardModel.setOnCardDimissedListener(new CardModel.OnCardDimissedListener() {
        @Override
        public void onLike() {
            Log.i("Swipeable Cards","I like the card");
            datasource.createComment(title);
        }

        @Override
        public void onDislike() {
            Log.i("Swipeable Cards","I dislike the card");
            datasource.deleteComment(title);
        }
    });

    adapter.add(cardModel);

    mCardContainer.setAdapter(adapter);
}

/****************** Update ******************/ I tried repeating setOnCardDismissedListener on all my cradModels. I wanna save the title of the cardModel if is onLike. However, I checked my database, I did save it twice but both titles are "title2", I wonder why "title1" isn't saved.

    CardModel cardModel1 = new CardModel("Title1", "Description goes here",
            r.getDrawable(R.drawable.picture1));
    final String title1 = cardModel1.getTitle();

    CardModel cardModel2 = new CardModel("Title2", "Description goes here",
            r.getDrawable(R.drawable.picture1));
    final String title2 = cardModel2.getTitle();
    adapter.add(cardModel1);
    adapter.add(cardModel2);
    cardModel1.setOnClickListener(new CardModel.OnClickListener() {
        @Override
        public void OnClickListener() {
            Log.i("Swipeable Cards", "I am pressing the card");
        }
    });
    cardModel1
            .setOnCardDimissedListener(new CardModel.OnCardDimissedListener() {
                // onLike swipe to left, but we want it to be removed
                @Override
                public void onLike() {
                    Log.i("Swipeable Cards", "I like the card");
                    datasource.createComment(title1);
                }

                // disLike swipe to right, but we want it to be saved
                @Override
                public void onDislike() {
                    Log.i("Swipeable Cards", "I dislike the card");
                }
            });

    cardModel2.setOnClickListener(new CardModel.OnClickListener() {
        @Override
        public void OnClickListener() {
            Log.i("Swipeable Cards", "I am pressing the card");
        }
    });
    cardModel2
            .setOnCardDimissedListener(new CardModel.OnCardDimissedListener() {
                // onLike swipe to left, but we want it to be removed
                @Override
                public void onLike() {
                    Log.i("Swipeable Cards", "I like the card");
                    datasource.createComment(title2);
                }
                // disLike swipe to right, but we want it to be saved
                @Override
                public void onDislike() {
                    Log.i("Swipeable Cards", "I dislike the card");
                }
            });

Upvotes: 1

Views: 3828

Answers (1)

r2DoesInc
r2DoesInc

Reputation: 3771

Just repeat that setOnCardDimissedListener on all your card models.

If the interface returned some sort of token, you could set a single OnCardDimissedListener for ALL the card models, but unfortunately if you do that, youll have no way of knowing which card was acted upon.

You will need to have a different OnCardDimissedListener instance set on each of the cardmodels you create.

Edit - did you even look at the github page?

Additionally, you can set up a Delegate to be notified when the image is being liked or disliked: 

card.setOnCardDimissedDelegate(new CardView.OnCardDimissedDelegate() {
        @Override
        public void onLike(CardView cardView) {
            Log.d("Swipeable Card", "I liked it");
        }

        @Override
        public void onDislike(CardView cardView) {
            Log.d("Swipeable Card", "I did not liked it");
        }
    });

create a class instance of that OnCardDimissedDelegate and set it on each of the cards.

Upvotes: 1

Related Questions