将onClickListener设置为RecyclerView

时间:2017-04-29 13:33:35

标签: android android-recyclerview onclicklistener

我正在尝试使用自定义项创建一个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();
    }
}

我不确定接下来该怎么办,我会帮助你。 提前谢谢!

3 个答案:

答案 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数据绑定来减少你的样板。