Jesse
Jesse

Reputation: 562

RecyclerView Cards - Open new Activity

I have a basic application which gets some data from a JSON file online. It's an array of 6 items. Each item consists of a few integers, strings etc. Only showing 1 string and integer in the list of cards.

When I click on a card. A new activity should be opened and a more detailed view should open. I already made this acitivty without filling in the data. Just to build the layout. But now I'm kind of stuck.

A normal onClick event that starts a new Intent from my main activity is no problem. The problems are that I don't know where and how to implement a onClick method on a button ON the card, while still knowing which card is clicked so I can provide the correct information.

Any ideas on this topic? Been searching all night already but seem to fail every time.

Edit: The 6 items are stored in a List in the main activity. So I just need to get to know the index number of the clicked item so I can read out the right item in the detail view.

Second edit viewHolder click doesn't register any click...

public static class ParkingViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    CardView cv;
    TextView parkingName;
    TextView parkingCapacity;

    ParkingViewHolder(View itemView) {
        super(itemView);

        cv = (CardView)itemView.findViewById(R.id.cv);
        parkingName = (TextView)itemView.findViewById(R.id.parkingName);
        parkingCapacity = (TextView)itemView.findViewById(R.id.parkingCapacity);
    }

    @Override
    public void onClick(View v) {
        Toast.makeText(v.getContext(), "The Item Clicked is: " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
    }

}

Upvotes: 1

Views: 1915

Answers (2)

Reprator
Reprator

Reputation: 3069

Give a hand to this code,

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;


import java.util.List;

import modals.Feeds;


/**
 * Created by inext on 3/7/15.
 */
public class CAdapter extends RecyclerView.Adapter<CAdapter.ViewHolder> {

    private List<Feeds> items;
    private Context context;

    public CAdapter(final Context context, final List<Feeds> items, final FragmentClicked listener) {
        this.items = items;
        this.listener = listener;
        this.context = context;
    }

    @Override
    public CAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.frag_newfeed_row, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final FeedAdapter.ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public CircleImageView userImage;
        public TextView txt_user, txt_msg, txt_minute;

        public ViewHolder(View itemView) {
            super(itemView);
            Button btn = (Button) itemView.findViewById(R.id.frag_nfrow_bt_comment);
            btn.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            Intnet in=new (context,OtherActivity.class);
startactivity(in);
        }
    }

}

Upvotes: 1

poss
poss

Reputation: 1789

Here is what I do.

You have some kind of ViewHolder, you extend OnClickListener on it.

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener

In your ViewHolder you declare what should be clickListened - for example

protected ImageView vRowImage;

public ViewHolder(View v) {
            super(v);
            vRowImage = (ImageView) v.findViewById(R.id.rowImage);

            vRowImage.setClickable(true);
            vRowImage.setOnClickListener(this);
        }

Only image would be clickListened in this example - you can do it on button, whole view v or anything you want.

Add private OnItemClickListener to your adapter.

private OnItemClickListener mItemClickListener;

Override onClick in ViewHolder

@Override
    public void onClick(View v) {
        if (mItemClickListener != null) {
            mItemClickListener.onItemClick(v, getLayoutPosition());
        }
    }

Add interface and Set method

public interface OnItemClickListener {
    void onItemClick(View view , int position);
}

public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) {
    this.mItemClickListener = mItemClickListener;
}

And in your activity / fragment you just call

mAdapter.SetOnItemClickListener(new MySomethingAdapter.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
    //you have view and position here
    }
}

Upvotes: 1

Related Questions