简体   繁体   English

RecyclerView onClick 用于多个按钮并从 Activity 处理

[英]RecyclerView onClick for multiple buttons and handling from Activity

I'm using RecyclerView with CardView and inside the CardView have 2 buttons.我使用RecyclerViewCardView和内部CardView有2个按钮。 Now, have implemented the onClick events by implementing View.OnClickListener by the ViewHolder static class and overriding the event (its working )like现在,通过ViewHolder静态类实现View.OnClickListener并覆盖事件(其工作)来实现onClick事件

    @Override
    public void onClick(View v) {

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

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

        }
     }

Looking for a solution/pattern to handle the Click in the Activity class like寻找解决方案/模式来处理Activity类中的Click ,例如

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 .

The above code working fine and able to log the Clicks but not able to differentiate which button has clicked.上面的代码工作正常,能够记录Clicks但无法区分点击了哪个按钮。

Appreciate any help感谢任何帮助

here is the best way to achieve that:--这是实现这一目标的最佳方法:-

this is how i have implemented这就是我实施的方式

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

and in your activity where you initialize the 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);
            }
        }); 

Please, try this principle to create a communication between activity, adapter through the interface, I hope this principle helps you:请试试这个原理,通过接口创建activity、adapter之间的通信,希望这个原理对你有帮助:

Model Class:型号分类:

public class YourModel {

    private String firstName;
    private String lastName;

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

    //... setters & getters
}

Interface:界面:

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

Adapter:适配器:

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

I think that this information is enough to understand what I mean.我认为这些信息足以理解我的意思。 The same principle you can create multiple OnClick methods in your interface or put one onClick for a few buttons and check id or something else to get needed information that you need.同样的原则,您可以在界面中创建多个 OnClick 方法,或者为几个按钮放置一个 onClick 并检查 id 或其他内容以获取所需的信息。 Good luck祝你好运

Here my solution if it could help someone.这是我的解决方案,如果它可以帮助某人。

You could click in one item of the recyclerview or one of the two buttons.您可以单击回收站视图中的一项或两个按钮之一。

The interface implements:接口实现:

onStudentItemClick, for click in the recyclerview item onStudentItemClick,用于单击 recyclerview 项

onChatItemClick and onAbsenceItemClick for click the buttons onChatItemClick 和 onAbsenceItemClick 用于单击按钮

With

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

                }
            });

I set the click listener for one button我为一个按钮设置了点击监听器

And in the class StudentViewHolder I implement OnClickListener and override onClik在 StudentViewHolder 类中,我实现了 OnClickListener 并覆盖了 onClik

@Override
        public void onClick(View v) {

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

Here the Adapter:这里的适配器:

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

}

Try this尝试这个

In your activity do like this在你的活动中这样做

CustomItemClickListener listner;

listner=YourActivityName.this   // in OnCreate Method

and pass this listner in your adapter并在您的适配器中传递此侦听器

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

And in your Adapter use it like this在你的适配器中像这样使用它

CustomItemClickListener listner;

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

and last in your onBindViewHolder do like this最后在你的 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
            }
        });

I do it this way.我这样做。

  1. Set an OnClickListener on your Button in the ViewHolder在 ViewHolder 中的 Button 上设置 OnClickListener

  2. Create a method in your activity with the button position as a parameter在您的活动中创建一个方法,将按钮位置作为参数

  3. Pass the position of the clicked entry and do stuff传递单击条目的位置并执行操作

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM