Android: intention from viewing Recycler to action

I have a recycler view that has many items that I want to use for each item for specific actions. I tried many ways, but everyone is not able to engage in activities.

This is the adapter:

public class ItemsAdapter extends RecyclerView.Adapter<ItemsAdapter.ViewHolder> { private ArrayList<String> itemsData; public ItemsAdapter(ArrayList<String> itemsData) { this.itemsData = itemsData; } @Override public ItemsAdapter.ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { View itemLayoutView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item, null); final ViewHolder viewHolder = new ViewHolder(itemLayoutView); itemLayoutView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String word = viewHolder.txtViewTitle.getText().toString(); Toast.makeText(parent.getContext(),word,Toast.LENGTH_LONG).show(); } }); return viewHolder; } @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { viewHolder.txtViewTitle.setText(itemsData.get(position)); viewHolder.imgViewIcon.setImageResource(R.drawable.imsge_profile); } public static class ViewHolder extends RecyclerView.ViewHolder { public TextView txtViewTitle; public ImageView imgViewIcon; public ViewHolder(View itemLayoutView) { super(itemLayoutView); txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title); imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon); } } @Override public int getItemCount() { return itemsData.size(); } 

}


This is main_activity :

 public class MainActivity extends ActionBarActivity { Toolbar tBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tBar = (Toolbar) findViewById(R.id.app_bar); setSupportActionBar(tBar); getSupportActionBar().setTitle("AdroidCode Recycler View"); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); ArrayList<String> listItems = new ArrayList<String>(); listItems.add("Tom"); listItems.add("Hamdy"); listItems.add("John"); listItems.add("Hasna"); listItems.add("Fadi"); listItems.add("Samer"); recyclerView.setLayoutManager(new LinearLayoutManager(this)); ItemsAdapter mAdapter = new ItemsAdapter(listItems); recyclerView.setAdapter(mAdapter); recyclerView.setItemAnimator(new DefaultItemAnimator()); } 

}


I tried this instead of Toast, but dosent work

 @Override public void onClick(View v) { final Intent intent; switch (getPostion()){ case 0: intent = new Intent(context, FirstActivity.class); break; case 1: intent = new Intent(context, SecondActivity.class); break; ... default: intent = new Intent(context, DefaultActivity.class); break; } context.startActivity(intent); } 

new adapter

 public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> { public static class PersonViewHolder extends RecyclerView.ViewHolder { CardView cv; TextView personName; TextView personAge; ImageView personPhoto; public PersonViewHolder(View itemView) { super(itemView); cv = (CardView)itemView.findViewById(R.id.cv); personName = (TextView)itemView.findViewById(R.id.person_name); personAge = (TextView)itemView.findViewById(R.id.person_age); personPhoto = (ImageView)itemView.findViewById(R.id.person_photo); recyclerview.addOnItemTouchListener(new RecyclerItemClickListener( context, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { // TODO Auto-generated method stub final Intent intent; switch (position) { case 0: intent = new Intent(context, secoundActivity.class); break; } } )); }} } List<Person> persons; RVAdapter(List<Person> persons){ this.persons = persons; } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); } @Override public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false); PersonViewHolder pvh = new PersonViewHolder(v); return pvh; } @Override public void onBindViewHolder(PersonViewHolder personViewHolder, int i) { personViewHolder.personName.setText(persons.get(i).name); personViewHolder.personAge.setText(persons.get(i).age); personViewHolder.personPhoto.setImageResource(persons.get(i).photoId); } @Override public int getItemCount() { return persons.size(); } 

}

0
source share
3 answers
 RecyclerView recyclerView = findViewById(R.id.recycler); recyclerView.addOnItemTouchListener( new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { // do whatever } }) ); 

I think you need to add a click listener when you analyze the recycler view. Try these

+1
source

 public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private OnItemClickListener mListener; public interface OnItemClickListener { public void onItemClick(View view, int position); } GestureDetector mGestureDetector; public RecyclerItemClickListener(Context context, OnItemClickListener listener) { mListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } }); } @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { mListener.onItemClick(childView, view.getChildPosition(childView)); } return false; } @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } } 
+1
source

You cannot directly use onclick. I found a solution and it works for me. Give it a try. Hope this helps you.

Step 1: Fist add this RecyclerItemClickListener class to your package.

 public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private OnItemClickListener mListener; public interface OnItemClickListener { public void onItemClick(View view, int position); } GestureDetector mGestureDetector; public RecyclerItemClickListener(Context context, OnItemClickListener listener) { mListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } }); } @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { mListener.onItemClick(childView, view.getChildPosition(childView)); } return false; } @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } } 

Step 2: Now use the onclick method. this gives you the position of the item pressed. As soon as you receive a position, than you can use it according to your requirement.

 recyclerview.addOnItemTouchListener(new RecyclerItemClickListener( context, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, position + "", Toast.LENGTH_SHORT).show(); final Intent intent; switch (position) { case 0: Toast.makeText(context, "case 0", Toast.LENGTH_SHORT).show(); intent = new Intent(context,FirstActivity.class); break; case 1: Toast.makeText(context, "case 1", Toast.LENGTH_SHORT).show(); intent = new Intent(context,SecondActivity.class); break; default: intent = new Intent(context,DefaultActivity.class); break; } })); 
0
source

All Articles