解决了
我们已经解决了混合您的答案的问题,因此决定在这里写下。
关键是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<Object> 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<Object> initializeList() {
ArrayList<Object> objects= new ArrayList<>();
objects.add(new Object(...));
return objects;
}
}
非常感谢你们。
原始问题
我有一个
RecyclerView
,其中包含一些CardViews
。此CardViews
具有两个不同的ImageButton
,当您单击它们时,它们会产生不同的结果(很明显)。这是
card_object.xml
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/object_card"
card_view:cardCornerRadius="2dp"
card_view:cardElevation="2dp"
card_view:cardBackgroundColor="@color/colorPrimary"
android:clickable="true">
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
android:background="@color/colorPrimary">
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/object_card_first_button"
android:src="@drawable/contact_100px"
android:maxHeight="25dp"
android:maxWidth="25dp"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:background="@color/transparentBackgroundPrimary"
android:layout_marginRight="54dp"
android:layout_marginEnd="54dp"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/forward_100px"
android:maxHeight="25dp"
android:maxWidth="25dp"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:background="@color/transparentBackgroundPrimary"
android:id="@+id/object_card_second_button" />
</LinearLayout>
</android.support.v7.widget.CardView>
这是我的
ObjectAdapter.java
的主要代码:public class ObjectAdapter
extends RecyclerView.Adapter<ObjectAdapter.ViewHolder>
implements View.OnClickListener {
private ArrayList<Object> objects;
private int itemLayout;
private View.OnClickListener onClickListener;
public ObjectAdapter(ArrayList<Object> 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<Object> 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<Object> initializeList() {
ArrayList<Object> 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;
}
}