RecyclerView:如何添加OnClick()并保持onLongClick()正常工作? [英] RecyclerView: how to add OnClick() and keep onLongClick() working?

查看:124
本文介绍了RecyclerView:如何添加OnClick()并保持onLongClick()正常工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在CheckBox上为RecyclerView设置了一个onClickListener,该RecyclerView拥有CardViews列表.侦听器在扩展ViewHolder的我的ItemHolder中设置.初次单击CardView会检查CheckBox,并将CardView的背景颜色从默认的白色切换为红色.这工作正常.

I have an onClickListener set on a CheckBox for a RecyclerView that holds a list of CardViews. The listener is set up in my ItemHolder that extends ViewHolder. An initial click on a CardView checks the CheckBox and toggles the CardView's background color from the default white color to red. This is working properly.

我也在CardView本身上设置了OnClickListener. OnClickListeneronCreateViewHolder()中设置.单击CardView会为CardView启动一个新的详细信息活动.这工作正常.

I also have an OnClickListener set up on the CardView itself. The OnClickListener is set up in the onCreateViewHolder(). A click on the CardView launches a new Detail Activity for the CardView. This is working properly.

最后,我尝试在CardView本身上设置一个onLongClickListener. OnLongClickListener在onCreateViewHolder()中设置.长按CardView的目的是将背景色切换为红色并启动AlertDialog,以便用户可以确认CardView将从列表中删除.这可以正常工作,但是当将此代码添加到适配器时,CardView的CheckBox的OnClickListerner不再起作用.好像OnLongClickListner与CheckBox侦听器冲突.注意,我在itemHolder的onLongClick()代码中返回true".我在这里想念什么?

Lastly, I tried to set up an onLongClickListener on the CardView itself. The OnLongClickListener is set up in the onCreateViewHolder(). A longpress on the CardView is meant to toggle the background color to red and launch an AlertDialog so the user can confirm that the CardView will be deleted from the list. This works properly but when this code is added to the Adapter then the OnClickListerner for the CardView's CheckBox no longer works. It is as if the the OnLongClickListner is in conflict with the CheckBox listener. Note I do "return true" in the itemHolder's onLongClick() code. What am I missing here?

Adapter.java

Adapter.java

public MyRecylerAdapter(Context context, ArrayList<ListItem> listItems, ArrayList<ListItem> selectedList) {
    this.mContext = context;
    this.mListItems = listItems;
    this.selectedItemsList = selectedList;
}

private int selectedPos = -1;
...

private class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    private CardView cardView;
    private CheckBox chkSelected;

    private ItemHolder(final View itemView) {
        super(itemView);

        cardView = (CardView) itemView.findViewById(R.id.singlecard_view1);
        chkSelected = (CheckBox) itemView.findViewById(R.id.chkSelected);
        chkSelected.setOnClickListener(this);
    }

    public void onClick(View v) {

        int adapterPos = getAdapterPosition();

        if (adapterPos == android.support.v7.widget.RecyclerView.NO_POSITION) return;
        if (recyclerItemClickListener !=null) {
            recyclerItemClickListener.onCheckBoxClick(v, adapterPos);
        }
        Integer iPos = adapterPos;

        if (((CheckBox)v).isChecked()) {
            checkedListItems.add(iPos);
        }
        else {
            checkedListItems.remove(iPos);
        }
    }

    void bind(int position) {

        if (checkedListItems.contains(position)) {
            chkSelected.setChecked(true);
        }
        else {
            chkSelected.setChecked(false);
        }
    }
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_contact_item, parent, false);
    final ItemHolder itemHolder = new ItemHolder(view);

        itemHolder.itemView.setOnClickListener(new View.OnClickListener() {
            // Handles the row being clicked.
            @Override
            public void onClick(View view) {

                ListItem adapterItem = MyRecylerAdapter.this.getItem(itemHolder.getAdapterPosition()); 

                if (recyclerItemClickListener != null) {
                    recyclerItemClickListener.onItemClick(itemHolder.itemView, adapterItem);
                }
            }
        });

        itemHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {

                ListItem adapterItem2 = MyRecylerAdapter.this.getItem(itemHolder.getAdapterPosition()); 

                    if (recyclerItemClickListener != null) {
                        recyclerItemClickListener.onItemLongClick(itemHolder.itemView, adapterItem2);
                    }

                int adapterPos2 = itemHolder.getAdapterPosition(); 
                if (adapterPos2 != android.support.v7.widget.RecyclerView.NO_POSITION) {
                    int lastSelectedPosition = selectedPos;
                    selectedPos = adapterPos2;
                    notifyItemChanged(lastSelectedPosition);
                    notifyItemChanged(selectedPos);
                }                    
                return true;
            }
        });
    return itemHolder;
}

public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {

    final ListItem listItem = mListItems.get(position);
    final ItemHolder itemHolder = (ItemHolder) holder;

    itemHolder.bind(position);

    if (checkedListItems.contains(position)) {
        itemHolder.cardView.setActivated(true);
    }
    else {
        itemHolder.cardView.setActivated(false);
    }        

    // **The addition of the below code causes the "itemHolder.cardView.
    // setActivated(true);" in onBindViewHolder method to no longer fire, as 
    // a click on the CheckBox no longer changes the CardView background 
    // color.**
    if (itemHolder.getAdapterPosition() == selectedPos) {
        itemHolder.cardView.setActivated(true);
    } else {
        itemHolder.cardView.setActivated(false);
    }

list_contact_item.xml

list_contact_item.xml

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/singlecard_view1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:foreground="?android:attr/selectableItemBackground"
     >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/statelist_cardview_background"  >

    <CheckBox
        android:id="@+id/chkSelected"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="4dp"
        android:layout_marginStart="4dp"
        android:layout_marginTop="4dp"
        android:gravity="center"  />

    <TextView
        android:id="@+id/cardType1"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_toRightOf="@+id/chkSelected"
        android:layout_toEndOf="@+id/chkSelected"
        android:layout_alignParentTop="true"
        android:paddingStart="3dp"
        android:paddingLeft="3dp"
        android:paddingEnd="6dp"
        android:paddingRight="6dp"
        android:layout_marginTop="4dp"
        android:gravity="center"
        android:textColor="#ffffff"
        android:textStyle="bold|italic"
        style="@style/Base.TextAppearance.AppCompat.Subhead"  />

    <TextView
        android:id="@+id/cardBlankText1"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/cardType1"
        android:layout_toEndOf="@+id/cardType1"
        android:layout_toLeftOf="@+id/cardBlankTextNumstotal"
        android:layout_toStartOf="@+id/cardBlankTextNumstotal"
        android:layout_marginTop="4dp"
        android:gravity="center_vertical|end"
        android:text="#"
        android:textColor="@color/colorFlLabelFinal"
        android:textStyle="bold"
        android:maxLines="1"
        style="@style/Base.TextAppearance.AppCompat.Subhead"  />

    <TextView
        android:id="@+id/cardBlankTextNumstotal"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:gravity="center"
        android:text="actual card #"
        android:layout_marginTop="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginEnd="4dp"
        android:freezesText="true"
        android:textColor="@android:color/black"
        android:maxLines="1"
        style="@style/Base.TextAppearance.AppCompat.Subhead"  />        

    <TextView
        android:id="@+id/cardBlankText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/chkSelected"
        android:layout_marginTop="4dp"
        android:layout_marginLeft="6dp"
        android:layout_marginStart="6dp"
        android:text="todo"
        android:textColor="@android:color/black"
        android:textStyle="bold"
        android:background="@drawable/todo_underline"
        android:maxLines="1"
        style="@style/Base.TextAppearance.AppCompat.Headline"  />

    ...
    </RelativeLayout>

</android.support.v7.widget.CardView>

statelist_cardview_background.xml

statelist_cardview_background.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_activated="true"

        android:drawable="@color/item_selected" />

    <item android:state_activated="false"

        android:drawable="@color/list_contact_item_default"  />

</selector>

colors.xml

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <color name="list_contact_item_default">#FFFFFF</color>
    <color name="item_selected">#FF0000</color>

</resources>

推荐答案

似乎您在尝试解决错误的问题.您不应该不设置点击&卡视图上的长按侦听器本身.

It seems you are trying to solve the wrong problem here. You should not set click & long click listeners on card view itself.

  • 您可以在复选框
  • 上设置点击监听器或checkedChangeListener
  • 单击&长按监听器可以位于 view_container
  • 的其余部分
  • You can have click listener OR checkedChangeListener on Checkbox
  • click & long click listeners can be on rest of the view_container

在这里,如果您想在单击view_container时也选中/取消选中该复选框 ,则可以在view_container的 onClick 侦听器中轻松地做到这一点.

Here if you want to check/uncheck the checkbox also on click of view_container, you can easily do it in view_container's onClick listener.

修改: 我已经更新了您的布局文件,请注意,现在您在FrameLayout上是RelativeLayout(view_container)&复选框.

Edit: I have updated your layout file, notice now you have on FrameLayout as parent of RelativeLayout(view_container) & Checkbox.

由于在RelativeLayout之后添加了复选框,因此它将在view_container顶部可见.希望它对您有用.

As Checkbox is added after RelativeLayout it will be visible on top of view_container. Hope it will work for you.

现在,您可以如上文所述设置点击监听器.

Now you can set click listeners as I explained above.

更新的布局文件

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/singlecard_view1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:foreground="?android:attr/selectableItemBackground"
    >
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/view_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/statelist_cardview_background"  >


        <TextView
            android:id="@+id/cardType1"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_marginLeft="30dp"
            android:layout_marginStart="30dp"
            android:layout_alignParentTop="true"
            android:paddingStart="3dp"
            android:paddingLeft="3dp"
            android:paddingEnd="6dp"
            android:paddingRight="6dp"
            android:layout_marginTop="4dp"
            android:gravity="center"
            android:textColor="#ffffff"
            android:textStyle="bold|italic"
            style="@style/Base.TextAppearance.AppCompat.Subhead"  />

        <TextView
            android:id="@+id/cardBlankText1"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_alignParentTop="true"
            android:layout_toRightOf="@+id/cardType1"
            android:layout_toEndOf="@+id/cardType1"
            android:layout_toLeftOf="@+id/cardBlankTextNumstotal"
            android:layout_toStartOf="@+id/cardBlankTextNumstotal"
            android:layout_marginTop="4dp"
            android:gravity="center_vertical|end"
            android:text="#"
            android:textColor="@color/colorFlLabelFinal"
            android:textStyle="bold"
            android:maxLines="1"
            style="@style/Base.TextAppearance.AppCompat.Subhead"  />

        <TextView
            android:id="@+id/cardBlankTextNumstotal"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_alignParentTop="true"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:gravity="center"
            android:text="actual card #"
            android:layout_marginTop="4dp"
            android:layout_marginRight="4dp"
            android:layout_marginEnd="4dp"
            android:freezesText="true"
            android:textColor="@android:color/black"
            android:maxLines="1"
            style="@style/Base.TextAppearance.AppCompat.Subhead"  />

        <TextView
            android:id="@+id/cardBlankText2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginTop="34dp"
            android:layout_marginLeft="6dp"
            android:layout_marginStart="6dp"
            android:text="todo"
            android:textColor="@android:color/black"
            android:textStyle="bold"
            android:background="@drawable/todo_underline"
            android:maxLines="1"
            style="@style/Base.TextAppearance.AppCompat.Headline"  />

        ...
    </RelativeLayout>
        <CheckBox
            android:id="@+id/chkSelected"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_alignParentTop="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginTop="4dp"
            android:gravity="center"  />

    </FrameLayout>


</android.support.v7.widget.CardView>

这篇关于RecyclerView:如何添加OnClick()并保持onLongClick()正常工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆