web-dev-qa-db-fra.com

RecyclerView onClick pour plusieurs boutons et la gestion de l'activité

J'utilise RecyclerView avec CardView et à l'intérieur de la CardView ont 2 boutons. Maintenant, avez implémenté les événements onClick en implémentant View.OnClickListener par la classe statique ViewHolder et en remplaçant l'événement (son fonctionnement) comme 

    @Override
    public void onClick(View v) {

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

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

        }
     }

Vous recherchez 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 correctement et permet de consigner la Clicks mais ne peut pas différencier le bouton sur lequel l'utilisateur a cliqué.

Appréciez toute aide. Merci d'avance. 

7
user2695433

voici le meilleur moyen d'y parvenir: -

voici comment j'ai implémenté 

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) {

                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());

            }

            @Override
            public void iconImageViewOnClick(View v, int position) {

                followUserProfile(followersList.get(position).getID(),1);
            }

            @Override
            public void iconImageUnFollowOnClick(View v, int position){

                followUserProfile(followersList.get(position).getID(),0);
            }
        }); 
7
headshoT

S'il vous plaît, essayez ce principe pour créer une communication entre l'activité, adaptateur via l'interface, j'espère que ce principe vous aide:

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 AdapterCallback {

private YourAdapter adapter;
private List<String> items;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 1. init your list && fill it with needed data
    // 2. init your adapter 
    // 3. put your list as parameter into constructor + interface
    items = new ArrayList<String>() // empty
    adapter = new YourAdapter(items, this)
}

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

Je pense que cette information est suffisante 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 une onClick pour quelques boutons et de vérifier l'id ou autre chose pour obtenir les informations nécessaires. Bonne chance

6
Sasha Khyzhun

Voici ma solution si cela 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 implémente:

onStudentItemClick, pour click dans l'élément 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 règle l'auditeur de clic pour un bouton

Et dans la classe StudentViewHolder, j'implémente OnClickListener et substitue 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));
            }
        }
    }
}

Fragmenter l'implémenter 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) {
    ...

}
0
Alezis

Je le fais de cette façon.

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

  2. Créez une méthode dans votre activité avec la position du bouton en tant que paramètre

  3. Passer la position de l'entrée cliquée 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
Roman

Essaye ça

Dans ton activité fais comme ça

CustomItemClickListener listner;

listner=YourActivityName.this   // in OnCreate Method

et passez cet auditeur dans votre adaptateur

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

Et dans votre adaptateur utilisez-le comme ça

CustomItemClickListener listner;

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

et enfin dans votre onBindViewHolder faire 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
AbhayBohra