我正在尝试使用自定义项创建一个Recycleview,如果我点击该项的ImageView它会做一件事(更改图像,并选择项),如果我点击该项内的任何其他位置,它做了另一件事(打开新活动)
到目前为止,这是我的代码:
item_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<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:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="2dp"
card_view:cardCornerRadius="4dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<ImageView
android:id="@+id/Category"
android:scaleType="fitCenter"
android:layout_centerVertical="true"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginRight="25dp"/>
<TextView
android:id="@+id/Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/Category"
android:layout_marginBottom="2dp"
android:text="Title" />
<TextView
android:id="@+id/Date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/Title"
android:layout_toRightOf="@id/Category"
android:paddingLeft="5dp"
android:text="Date"/>
<TextView
android:id="@+id/Value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="Value"/>
</RelativeLayout>
</android.support.v7.widget.CardView>
listitem_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.inducesmile.androidmusicplayer.view.ItemLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</FrameLayout>
ItemViewHolder.java
public class ItemViewHolder extends RecyclerView.ViewHolder {
public ImageView category;
public TextView title;
public TextView date;
public TextView value;
public ImageView image;
public ItemViewHolder(View itemView, ImageView category, TextView title, TextView date, TextView value, ImageView image ) {
super(itemView);
this.category = category;
this.title = title;
this.date = date;
this.value = value;
this.image = image;
}
public ItemViewHolder(View itemView) {
super(itemView);
category = (ImageView)itemView.findViewById(R.id.Category);
title = (TextView)itemView.findViewById(R.id.Title);
date = (TextView)itemView.findViewById(R.id.Date);
value = (TextView)itemView.findViewById(R.id.Value);
}
}
ItemAdapter.java
public class ItemAdapter extends RecyclerView.Adapter<ItemViewHolder> {
private Context context;
private List<ItemObject> allItem;
public ItemAdapter(Context context, List<ItemObject> allItem) {
this.context = context;
this.allItem = allItem;
}
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.listitem_layout, parent, false);
return new ItemViewHolder(view);
}
@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
ItemObject items = allItem.get(position);
//set imageview corresponding to category
switch (items.getItemCategory()){
case "Other": holder.category.setImageResource(R.drawable.ic_other ); break;
case "Bills": holder.category.setImageResource(R.drawable.ic_bills ); break;
case "Business": holder.category.setImageResource(R.drawable.ic_business ); break;
case "Clothes": holder.category.setImageResource(R.drawable.ic_clothes ); break;
case "Commute": holder.category.setImageResource(R.drawable.ic_commute ); break;
case "Entertainment": holder.category.setImageResource(R.drawable.ic_entertainment ); break;
case "Food": holder.category.setImageResource(R.drawable.ic_food ); break;
case "Groceries": holder.category.setImageResource(R.drawable.ic_groceries ); break;
case "Health": holder.category.setImageResource(R.drawable.ic_health ); break;
case "Investment": holder.category.setImageResource(R.drawable.ic_investment ); break;
case "Salary": holder.category.setImageResource(R.drawable.ic_salary ); break;
case "Travel": holder.category.setImageResource(R.drawable.ic_travel ); break;
default: holder.category.setImageResource(R.drawable.ic_default ); break;
}
holder.title.setText(items.getItemTitle());
holder.date.setText(String.valueOf(items.getItemDate()));
holder.value.setText( String.valueOf(items.getItemValue()));
}
@Override
public int getItemCount() {
return allItem.size();
}
}
我不确定接下来该怎么办,我会帮助你。 提前谢谢!
答案 0 :(得分:0)
使用它的最佳方法是将OnClickListener实现到ViewHolder类并在公共构造函数中设置侦听器。无需在运行时多次调用的onBindViewHolder中分配侦听器。即使您需要在某些条件下在运行时启用禁用,您也可以在侦听器中添加if / else以阻止该操作。
public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ImageView category;
public TextView title;
public TextView date;
public TextView value;
public ImageView image;
public ItemViewHolder(View itemView) {
super(itemView);
category = (ImageView)itemView.findViewById(R.id.Category);
title = (TextView)itemView.findViewById(R.id.Title);
date = (TextView)itemView.findViewById(R.id.Date);
value = (TextView)itemView.findViewById(R.id.Value);
// Set the listener to your involved views I.E
category.setOnClickListener(this);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// Do your things
switch(v.getId) {
}
}
}
答案 1 :(得分:0)
只需在适配器的holder.image.setOnClickListener()
方法末尾添加onBindViewHolder()
。
答案 2 :(得分:0)
您可能希望在onBindViewHolder中的Items上使用setOnClickListeners。
示例:
holder.title.setOnClickListener( (v) -> { .... });
如果您想与活动/片段共享点击,另一种方法是使用监听器。
interface ClickListener { void onClick(View view, String data) };
new ItemViewHolder ( context, myListener) { ... }
后可以使用
在ViewHolder中
public ItemAdapter (Context context, ClickListener listener, List ....) {
this.myListener = listener;
}
holder.title.setOnClickListener( v) -> myListener.onClick(view, "whateverdata"));
或者你可能想要使用Android数据绑定来减少你的样板。