单击属于RecyclerView内的CardView的ImageButton

解决了

我已经修好了你的答案,所以我决定写下这里。

关键是ViewHolder构造函数:

我删除了setOnClickListener()onClick()方法,我在ObjectAdapter.java定义了这个内部类。

 public static class ViewHolder extends RecyclerView.ViewHolder{ public ViewHolder(View itemView) { super(itemView); card_first_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int position = getAdapterPosition(); Toast.makeText(v.getContext(), object.get(position).getName(), Toast.LENGTH_SHORT).show(); } }); card_second_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(v.getContext(), "Forward button", Toast.LENGTH_SHORT).show(); } }); } } 

就这样。 class上的其他人都是一样的。

ObjectFragment.java是:

 public class ObjectFragment extends Fragment { public void ObjectFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater layoutInflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this Fragment return layoutInflater.inflate(R.layout.fragment_object, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); final ArrayList objects = initializeList(); if(!objects.isEmpty()) { RecyclerView recyclerView = (RecyclerView) getActivity().findViewById(R.id.objects_recyclerView); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.addItemDecoration(new SimpleDivider(getActivity().getApplicationContext())); final ObjectAdapter objectAdapter = new ObjectAdapter(objects, R.layout.card_object); recyclerView.setAdapter(objectAdapter); } } private ArrayList initializeList() { ArrayList objects= new ArrayList(); objects.add(new Object(...)); return objects; } } 

非常感谢你们。


原始问题

我有一个包含一些CardViewsRecyclerView 。 这个CardViews有两个不同的ImageButton ,当你点击它们时会产生不同的东西(很明显)。

这是card_object.xml

       

这是我的ObjectAdapter.java的主要代码:

 public class ObjectAdapter extends RecyclerView.Adapter implements View.OnClickListener { private ArrayList objects; private int itemLayout; private View.OnClickListener onClickListener; public ObjectAdapter(ArrayList objects, int itemLayout) { this.objects = objects; this.itemLayout = itemLayout; } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()) .inflate(itemLayout, viewGroup, false); view.setOnClickListener(this); return new ViewHolder(view); } public void setOnClickListener(View.OnClickListener listener) { this.onClickListener = listener; } public void onClick(View view) { if(onClickListener != null) { onClickListener.onClick(view); } } 

我的ObjectFragment.java是下一个:

 public class ObjectFragment extends Fragment { public void ObjectFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater layoutInflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this Fragment return layoutInflater.inflate(R.layout.fragment_object, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); final ArrayList objects = initializeList(); if(!objects.isEmpty()) { RecyclerView recyclerView = (RecyclerView) getActivity().findViewById(R.id.objects_recyclerView); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.addItemDecoration(new SimpleDivider(getActivity().getApplicationContext())); final ObjectAdapter objectAdapter = new ObjectAdapter(objects, R.layout.card_object); objectAdapter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Here I can manage my Object attributes, // but no the ImageButtons itselves } }); recyclerView.setAdapter(objectAdapter); } } private ArrayList initializeList() { ArrayList objects= new ArrayList(); objects.add(new Object(...)); return objects; } } 

我可以获取Object属性的值(名称,标题,等等),然后单击CardView等,但我无法让ImageButton拥有自己的onClick。

我不知道是否使用android:onClick()它可以显示特定卡的信息,但这是另一回事。

所以我的问题是如何让这两个按钮确实有自己的OnClickListener ,我应该声明它,以及如何处理RecyclerView的每个项目的信息(这部分几乎实现)。

任何想法? 非常感谢!

您可以像这样在ViewHolder类中添加按钮事件点击。

 public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener{ public ButtonImage firstButton; public ButtonImage secondButton; public RecyclerViewHolders(View itemView) { super(itemView); itemView.setOnClickListener(this); firstButton = (ImageButton)itemView.findViewById(R.id.object_card_first_button); firstButton = (ImageButton)itemView.findViewById(R.id.object_card_second_button); } @Override public void onClick(View view) { int id = view.getId(); switch (id){ case R.id.object_card_first_button: // button event break; case R.id.object_card_second_button // button event break; } } 

我认为像view.findViewById(R.id.mybutton).setOnClickListener(…); 应该做的工作。

如果有效,请告诉我。

像这样的东西?

 @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()) .inflate(itemLayout, viewGroup, false); view.setOnClickListener(this); ImageButton btn = (ImageButton)view.findViewById(R.id. object_card_first_button); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { something? } }); return new ViewHolder(view); } 

这已经过时了,但经过大量的试验和错误,我有一个适合我的解决方案,并且比其他人更容易。 保持ViewHolder RecycleronClickListeners相同,适配器相同:

在片段中的onClick()中:

 @Override public void onClick(View view, int position, int id) { switch (id) { case R.id.button_1: ImageButton button = (ImageButton) view; button.setImageResource(resource); // Or any other imagebutton action break; case R.id.button_2: ImageButton button = (ImageButton) view; button.setImageResource(resource); // Or any other imagebutton action break;