Reputation: 562
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
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
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