RecyclerView onClick 用于多个按钮和处理 Activity

RecyclerView onClick for multiple buttons and handling from Activity

我正在使用 RecyclerViewCardViewCardView 里面有 2 个按钮。现在,通过 ViewHolder 静态 class 实现 View.OnClickListener 并覆盖

之类的事件(它的工作)来实现 onClick 事件
    @Override
    public void onClick(View v) {

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

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

        }
     }

正在寻找一个 solution/pattern 来处理 Activity class 中的 Click like

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 .

以上代码工作正常并且能够记录 Clicks 但无法区分点击了哪个按钮。

感谢任何帮助

这是实现该目标的最佳方法:--

我就是这样实现的

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

并在您初始化适配器的 activity 中--

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

请尝试这个原理来创建activity之间的通信,适配器通过接口,我希望这个原理对你有帮助:

型号 Class:

public class YourModel {

    private String firstName;
    private String lastName;

    public YourModel(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    //... setters & getters
}

接口:

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

适配器:

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

    private List<YourModel> data;
    private AdapterCallback callback;
    private Context context;

    public YourAdapter(List<YourModel> data, AdapterCallback callback) {
        this.data = data;
        this.callback = callback
    }

    @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 = data.get(position);

        String lastName  = itemModel.getLastName();  
        String firstName = itemModel.getFirstName();

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

        holder.tvFirstName.setOnClickListener { 
           callback.onClickCallback(itemModel));
        }
    }

    @Override
    public int getItemCount() {
        return data.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);
        }

}

Activity:

public class MyActivity extends AppCompatActivity implements AdapterCallback {

private YourAdapter adapter;
private List<YourModel> 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<YourModel>()
    items.add(YourModel("John", "Doe"));
    items.add(YourModel("Bob", "Marley"));
    adapter = new YourAdapter(items, this)
}

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

我认为这些信息足以理解我的意思。 同样的原则,您可以在您的界面中创建多个 OnClick 方法,或者为几个按钮放置一个 onClick 并检查 id 或其他东西以获得您需要的信息。 祝你好运

试试这个

在你的 activity 中这样做

CustomItemClickListener listner;

listner=YourActivityName.this   // in OnCreate Method

并在您的适配器中传递此侦听器

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

然后在你的 Adapter 中像这样使用它

CustomItemClickListener listner;

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

最后在你的 onBindViewHolder 中这样做

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

我是这样做的

  1. 在 ViewHolder 中的 Button 上设置 OnClickListener

  2. 在您的 activity 中创建一个方法,将按钮位置作为参数

  3. 传递点击条目的位置并做一些事情

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

Activity

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

这里是我的解决方案,如果它可以帮助某人。

您可以单击 recyclerview 中的一项或两个按钮之一。

接口实现:

onStudentItemClick,用于点击 recyclerview 项目

onChatItemClick 和 onAbsenceItemClick 用于单击按钮

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

                }
            });

我设置了一个按钮的点击监听器

并且在 class StudentViewHolder 中我实现了 OnClickListener 并覆盖了 onClik

@Override
        public void onClick(View v) {

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

这里是适配器:

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

片段实现接口:

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

}