[英]Click an ImageButton which belongs to a CardView inside a RecyclerView
解决了
我已经修好了你的答案,所以我决定写下这里。
关键是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();
}
});
}
}
就这样。 班上的其他人都是一样的。
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;
}
}
非常感谢你们。
原始问题
我有一个包含一些CardViews
的RecyclerView
。 这个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;
}
}
我认为像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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.