5

我使用RecyclerViewCardViewCardView里面有2个按钮。现在,已经由ViewHolder静态类实现View.OnClickListener并重写事件(它的工作),如RecyclerView onClick多个按钮和处理从活动

@Override 
    public void onClick(View v) { 

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

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

     } 
    } 

寻找一个解决方案实施的onClick事件/图形处理ClickActivity类像

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,但无法区分哪个按钮已被点击。

感谢任何帮助。提前致谢。

+0

您可以使用setTag和getTag,当你首先定义你的按钮集标签为1和其他2,然后你可以通过调用v.getTag() – dali

回答

4

这里是实现这一目标的最佳途径: -

这是多么我已经实现

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

,并在你的活动,你初始化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

来区分这是我以前的尝试。但我在Recyclerview项目视图中有2个按钮,需要单独处理onClicks,而不是onItemClick为视图本身 – user2695433

+0

这是一个类似的应用程序,我以前用过,你可以参考这个 – headshoT

+0

非常感谢..我会试试看并会让你知道 – user2695433

1

尝试这个原则来创建活动,适配器和界面之间的沟通,我希望这会帮助你:

接口:

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

适配器:

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

} 

活动:

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

我认为,这个信息就足以明白我的意思。 同样的原则,您可以在界面中创建多个OnClick方法,或者将一个onClick方法放在少数几个按钮上,然后检查id或其他内容以获取所需的信息。 好运

+0

嘿,我只是想知道为什么你的活动实现View.OnClickListener?这是否需要实现AdapterCallback接口? – Burkely91

+0

@ Burkely91嘿,哎呀,我认为这是我的错误,我只是忘了删除它:) –

+0

你的方法看起来不错,但它不工作。错误表示setonclicklistener无法应用于查看(void) –

0

试试这个

在您的活动做这样

CustomItemClickListener listner; 

listner=YourActivityName.this // in OnCreate Method 

,并在适配器通过这个听者

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

而且在适配器中使用这样的

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

我做这种方式。

  1. 在ViewHolder

  2. 创建与按钮的位置作为一个参数

  3. 的活性的方法传递点击条目的位置设置一个OnClickListener在您的按钮和做的东西

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

活动

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

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

您可以点击回收站视图的一个项目或两个按钮之一。

接口实现:

onStudentItemClick,对于点击recyclerview项目

onChatItemClick和onAbsenceItemClick的点击按钮

随着

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

       } 
      }); 

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

而在类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) { 
    ... 

}