5

J'utilise RecyclerView avec CardView et à l'intérieur du CardView ont 2 boutons. Maintenant, ont mis en œuvre les onClick événements en mettant en œuvre View.OnClickListener par la classe statique ViewHolder et en remplaçant l'événement (son travail) commeRecyclerView onClick pour plusieurs boutons et la gestion de l'activité

@Override 
    public void onClick(View v) { 

     if (v.getId() == mClassBtn.getId()){ 

     } 
     else if (v.getId() == mDaysBtn.getId()){ 

     } 
    } 

Vous cherchez une solution/modèle pour gérer la Click dans la classe Activity comme

adapter = new ItemsListAdapter(getActivity(), data, new CustomItemClickListener() { 

    @override 
    public void onItemClick(View v, int position) { 

     Log.d(TAG, "clicked position:" + position); 
     // which button clicked and separate action for each button 
    } 
}); 
// CustomItemClickListener -- interface in the adapter class which holds the click event . 

Le code ci-dessus fonctionne très bien et peut enregistrer le Clicks mais ne peut pas différencier le bouton sur lequel vous avez cliqué.

Appréciez toute aide. Merci d'avance.

+0

Vous pouvez utiliser setTag et getTag, lorsque vous définissez votre balise set de boutons pour d'abord comme 1 et 2 autres, et ensuite vous pouvez différencier en appelant v.getTag() – dali

Répondre

4

est ici la meilleure façon d'y parvenir: -

c'est comment je l'ai mis en œuvre

public class FollowersDetailsAdapter extends RecyclerView.Adapter<FollowersDetailsAdapter.MyViewHolder> { 

    private List<GetUserFollowDetailsResponseData> followersList; 
    Context context; 
    public FollowersDetailsAdapterListener onClickListener; 


    public class MyViewHolder extends RecyclerView.ViewHolder { 
     public TextView rv_tv_follower_name, rv_tv_follower_desig; 
     public CircleImageView rv_iv_follower_image; 
     RelativeLayout rv_rel_layout_followers, rel_layout_followers; 
     LikeButton rv_iv_follower_icon; 

     public MyViewHolder(View view) { 
      super(view); 
      rv_rel_layout_followers = (RelativeLayout) view.findViewById(R.id.rv_rel_layout_followers); 
      rel_layout_followers = (RelativeLayout) view.findViewById(R.id.rel_layout_followers); 
      rv_iv_follower_image = (CircleImageView) view.findViewById(R.id.rv_iv_follower_image); 
      rv_tv_follower_name = (TextView) view.findViewById(R.id.rv_tv_follower_name); 
      rv_tv_follower_desig = (TextView) view.findViewById(R.id.rv_tv_follower_desig); 
      rv_iv_follower_icon = (LikeButton) view.findViewById(R.id.rv_iv_follower_icon); 
      rel_layout_followers.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        onClickListener.iconTextViewOnClick(v, getAdapterPosition()); 
       } 
      }); 
     } 

    } 

    public FollowersDetailsAdapter(List<GetUserFollowDetailsResponseData> FollowersList, FollowersDetailsAdapterListener listener) { 
     this.followersList = FollowersList; 
     this.onClickListener = listener; 

    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.followers_list_row, parent, false); 

     return new MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(final MyViewHolder holder, final int position) { 
     if (followersList.get(position).getImage() != null && !followersList.get(position).getImage().trim().equalsIgnoreCase("")) { 
      Picasso.with(context) 

        .load(followersList.get(position).getImage()) 
        .resize(200, 200).into(holder.rv_iv_follower_image); 
     } 

     holder.rv_tv_follower_name.setText(followersList.get(position).getName()); 
     holder.rv_tv_follower_desig.setText(followersList.get(position).getDescription()); 
     if (followersList.get(holder.getAdapterPosition()).getID() == Integer.parseInt(ApplicationPreference.getUserId())) { 
      holder.rv_iv_follower_icon.setVisibility(View.GONE); 
     } else { 
      holder.rv_iv_follower_icon.setVisibility(View.VISIBLE); 
      if (followersList.get(position).getIsFollowing() == 0) { 
       holder.rv_iv_follower_icon.setLiked(false); 
      } else if (followersList.get(position).getIsFollowing() == 1) { 
       holder.rv_iv_follower_icon.setLiked(true); 
      } 


     } 
     holder.rv_iv_follower_icon.setOnLikeListener(new OnLikeListener() { 
      @Override 
      public void liked(LikeButton likeButton) { 
       Log.e("liked", "bc"); 
       onClickListener.iconImageViewOnClick(likeButton, position); 
      } 

      @Override 
      public void unLiked(LikeButton likeButton) { 
       onClickListener.iconImageUnFollowOnClick(likeButton, position); 
      } 
     }); 

    } 

    public interface FollowersDetailsAdapterListener { 

     void iconTextViewOnClick(View v, int position); 

     void iconImageViewOnClick(View v, int position); 

     void iconImageUnFollowOnClick(View v, int position); 
    } 

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

et dans votre activité où vous initialisez le adapter--

followersDetailsAdapter = new FollowersDetailsAdapter(followersList, new FollowersDetailsAdapter.FollowersDetailsAdapterListener() { 
      @Override 
      public void iconTextViewOnClick(View v, int position) { 
       gotoUserProfile(followersList.get(position).getID()); 
       //Log.e("plz", "iconTextViewOnClick at position "+position); 
      } 

      @Override 
      public void iconImageViewOnClick(View v, int position) { 
       //Log.e("plz", "iconImageViewOnClick at position "+position); 
       followUserProfile(followersList.get(position).getID(),1); 
      } 

      @Override 
      public void iconImageUnFollowOnClick(View v, int position){ 
       //Log.e("plz", "iconImageUnFollowOnClick at position "+position); 
       followUserProfile(followersList.get(position).getID(),0); 
      } 
     }); 
+0

c'est ce que j'ai essayé précédemment. Mais j'ai 2 boutons dans la vue d'article Recyclerview et j'ai besoin de gérer les onClicks séparément plutôt que surItemClick pour la vue elle-même – user2695433

+0

c'est une application similaire que j'ai utilisée précédemment, vous pouvez prendre référence à partir de – headshoT

+0

Merci beaucoup .. Je vais l'essayer et vous permettra de savoir – user2695433

1

essayez ce principe pour créer une communication entre activité, adaptateur et interface, j'espère que cela vous aidera:

Interface:

public interface AdapterCallback { 
    void onClickCallback(YourModel itemModel); 
} 

Adaptateur:

public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> { 

private List<String> mList; 
private AdapterCallback callback; 
private Context context; 

public YourAdapter(List<String> list, AdapterCallback adapterCallback) { 
    this.mList = list; 
    adapter = adapterCallback 
} 

@Override 
public YourAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    context = parent.getContext(); 
    LayoutInflater inflater = LayoutInflater.from(context); 
    View item = inflater.inflate(R.layout.item_recycler, parent, false); 
    return new ViewHolder(item); 
} 

@Override 
public void onBindViewHolder(YourAdapter.ViewHolder holder, int position) { 
    YourModel itemModel = list.get(position); 

    String lastName = itemModel.getLastName(); // for example; 
    String firstName = itemModel.getFirstName(); // for example; 

    holder.tvFirstName.setText(firstName); 
    holder.tvLastName.setText(lastName); 

    holder.tvFirstName.setOnClickListener(
     // you can override this onClick into your Activity. 
     adapterCallback.onClickCallback(itemModel)); 
    } 
} 

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

static class ViewHolder extends RecyclerView.ViewHolder { 

    private TextView tvFirstName; 
    private TextView tvLastName; 

    ViewHolder(View itemView) { 
     super(itemView); 
     tvFirstName = (TextView) itemView.findViewById(R.id.tv_first); 
     tvLastName = (TextView) itemView.findViewById(R.id.tv_last); 
    } 

} 

Activité:

public class MyActivity extends AppCompatActivity implements View.OnClickListener, AdapterCallback { 

private YourAdapter adapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

@Override 
public void onClickCallback(YourModel itemModel) { 
    Toast.makeText(this, itemModel.getFirstName(), Toast.LENGTH_SHORT).show(); 
} 

Je pense que cette information est assez pour comprendre ce que je veux dire. Le même principe vous permet de créer plusieurs méthodes OnClick dans votre interface ou de mettre un onClick sur quelques boutons et de vérifier l'identifiant ou autre chose pour obtenir les informations dont vous avez besoin. Bonne chance

+0

Hey je me demandais juste pourquoi votre activité implémente View.OnClickListener? Est-ce nécessaire pour implémenter l'interface AdapterCallback? – Burkely91

+0

@ Burkely91 Hey, oups, je pense que c'est mon erreur, j'ai juste oublié de l'enlever :) –

+0

votre méthode semble bonne, mais ça ne fonctionne pas. L'erreur indique que setonclicklistener ne peut pas être appliqué à la vue (void) –

0

Essayez cette

Dans votre activité, utilisez cette

CustomItemClickListener listner; 

listner=YourActivityName.this // in OnCreate Method 

et de transmettre cette listner dans votre adaptateur

adapter = new ItemsListAdapter(getActivity(), data, listner); 

Et dans votre adaptateur utiliser comme ceci

CustomItemClickListener listner; 

this.listner=listner; // In your Adapter COnstructor 

et dernier dans votre onBindViewHolder font comme ça

holder.button1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       listner.onItemClick(holder.getLayoutPosition()); //getting position 
      } 
     }); 

holder.button2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       listner.onItemClick(holder.getLayoutPosition()); //getting position 
      } 
     }); 
0

je le fais de cette façon.

  1. Définir un OnClickListener sur votre bouton dans le ViewHolder

  2. Créer une méthode dans votre activité avec la position du bouton comme paramètre

  3. Passez la position de l'entrée cliqué et faire des choses

ViewHolder

yourButton.setOnClickListener(new View.OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 

     int position = getAdapterPosition(); //Clicked entry in your List 

     //Method from your activity 
     yourActivity.methodOnBtnClick(position); 
    } 

Activité

public void methodOnBtnClick(int position) 
{ 
    yourList.remove(position); 
    recycler.getAdapter().notifyDataSetChanged(); 
} 
0

Voici ma solution si elle pouvait aider quelqu'un.

Vous pouvez cliquer sur un élément de la vue de recyclage ou sur l'un des deux boutons.

L'interface met en œuvre:

onStudentItemClick, pour cliquer dans l'item de recyclerview

onChatItemClick et onAbsenceItemClick pour cliquer sur les boutons

Avec

holder.imgChat.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        mOnClickListener.onChatItemClick(mStudents.get(index)); 

       } 
      }); 

Je mets l'écouteur d'un clic pour un bouton

Et dans la StudentViewHolder classe je mets en œuvre OnClickListener et passer outre onClik

@Override 
     public void onClick(View v) { 

      if (mOnClickListener != null){ 
       int clickedPosition = getAdapterPosition(); 
       mOnClickListener.onStudentItemClick(mStudents.get(clickedPosition)); 
      } 
     } 

Voici l'adaptateur:

public class StudentsAdapter extends RecyclerView.Adapter<StudentsAdapter.StudentsViewHolder> { 

    private ListItemClickListener mOnClickListener; 
    private ArrayList<Student> mStudents; 

    public interface ListItemClickListener { 
     void onStudentItemClick(Student student); 
     void onChatItemClick(Student student); 
     void onAbsenceItemClick(Student student); 
    } 


    public StudentsAdapter(ArrayList<Student> students, ListItemClickListener listener) { 
     mStudents = students; 
     mOnClickListener = listener; 
    } 

    @Override 
    public StudentsViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
     Context context = viewGroup.getContext(); 
     int layoutIdForListItem = R.layout.student_list_item; 
     LayoutInflater inflater = LayoutInflater.from(context); 
     boolean shouldAttachToParentImmediately = false; 

     View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately); 
     StudentsViewHolder viewHolder = new StudentsViewHolder(view); 

     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(StudentsViewHolder holder, int position) { 
     final Integer index = position; 
     holder.tvStudent.setText(mStudents.get(position).nameForList()); 
     holder.imgChat.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mOnClickListener.onChatItemClick(mStudents.get(index)); 

      } 
     }); 
     holder.imgAbsence.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mOnClickListener.onAbsenceItemClick(mStudents.get(index)); 

      } 
     }); 

    } 

    public Student getItem(Integer position){ 
     return mStudents.get(position); 
    } 


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


    class StudentsViewHolder extends RecyclerView.ViewHolder 
      implements OnClickListener { 

     ImageView imgStudent; 
     TextView tvStudent; 
     ImageButton imgChat, imgAbsence; 

     public StudentsViewHolder(View itemView) { 
      super(itemView); 

      imgStudent = (ImageView) itemView.findViewById(R.id.img_student); 
      tvStudent = (TextView) itemView.findViewById(R.id.tv_student); 
      imgChat = (ImageButton) itemView.findViewById(R.id.btn_chat_student); 
      imgAbsence = (ImageButton) itemView.findViewById(R.id.btn_absence); 

      itemView.setOnClickListener(this); 
     } 


     @Override 
     public void onClick(View v) { 

      if (mOnClickListener != null){ 
       int clickedPosition = getAdapterPosition(); 
       mOnClickListener.onStudentItemClick(mStudents.get(clickedPosition)); 
      } 
     } 
    } 
} 

Fragment l'implémentent l'interface:

public class SubjectDetailFragment extends Fragment implements StudentsAdapter.ListItemClickListener { 
... 
@Override 
public void onStudentItemClick(Student student) { 
    StudentDetailFragment detailFragment = StudentDetailFragment.newInstance(); 
    Bundle bundle = new Bundle(); 
    bundle.putParcelable("student", student); 
    detailFragment.setArguments(bundle); 

    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.frame_layout, detailFragment); 
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 

} 

@Override 
public void onChatItemClick(Student student) { 
    ... 
} 

@Override 
public void onAbsenceItemClick(Student student) { 
    ... 

}