android recyclerview onclick只能用于带有按钮的cardview

时间:2018-03-05 11:32:08

标签: android android-recyclerview

我的recyclerview只有cardview,其中只有一个按钮:

<?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"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cvsearch"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <Button
        android:id="@+id/buttonsuggest"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Other Suggested Words"/>    

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

我在onCreateViewHolder中尝试以下内容

@Override
public PersonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardviewsearchsuggested, parent, false);
    SuggestedButton.PersonViewHolder viewHolder = new SuggestedButton.PersonViewHolder(v);
    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {    
    // do something here    
    }
    return pvh;
}

当我尝试通过点击cardview进行调试时,它不会进入onClick方法。

我的观众是

public static class SuggestedButton extends RecyclerView.ViewHolder {
    CardView cv;
    Button buttonsuggest;
    SuggestedButton(View itemView) {
        super(itemView);
        cv = (CardView)itemView.findViewById(R.id.cvsearch);
        buttonsuggest = (Button)itemView.findViewById(R.id.buttonsuggest);
    }
}

如果我有使用TextView而不是按钮的cardview它可以工作。

带有textview的cardview:

<?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"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cvsearch"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/textsuggest"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Other Suggested Words"/>


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

我的观察者是:

public static class SuggestedButton extends RecyclerView.ViewHolder {
        CardView cv;
        TextView textsuggest;
        SuggestedButton(View itemView) {
            super(itemView);
            this.searchRVAdapter = searchRVAdapter;
            cv = (CardView)itemView.findViewById(R.id.cvsearch);
            textsuggest = (TextView) itemView.findViewById(R.id.textsuggest);
        }
    }

@Override
public PersonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardviewsearchsuggested, parent, false);
    SearchSuggestRVAdapter.PersonViewHolder viewHolder = new SearchSuggestRVAdapter.PersonViewHolder(v);
    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

    // do something here

    }
    return pvh;
}

上面的代码完全正常。

临时解决方案

我必须在按钮的左右两侧添加20dp的边距。

<?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"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cvsearch"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <Button
        android:id="@+id/buttonsuggest"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:text="Other Suggested Words" />

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

然后,如果我点击空格(不在按钮上),onClick内的代码就可以了。

我所期待的是,如果我在itemview上提到onClicklisterner,那么点击cardview中的任何元素(也包括cardview)都应该没关系,onclick应该可以工作。

因为当我在cardview中有多个textview时,即使在任何textview上点击cardview也没关系。

按下按钮我认为可能有一些固有的方式将其点击视为独占。

5 个答案:

答案 0 :(得分:3)

android:clickable="false"添加到Button,因为默认情况下可启用按钮。因此您需要禁用clickable的{​​{1}}属性。现在Button将适用于您的onclick

解决方案:

Cardview

由于

答案 1 :(得分:1)

试试这个

public static class SuggestedButton extends RecyclerView.ViewHolder implements View.OnClickListener {
    CardView cv;
    Button buttonsuggest;
    SuggestedButton(View itemView) {
        super(itemView);
        cv = (CardView)itemView.findViewById(R.id.cvsearch);
        buttonsuggest = (Button)itemView.findViewById(R.id.buttonsuggest);
        cv.setOnClickListener(this);
    }

        @Override
        public void (View view) {    
            if (cv == view) {
               // do something here    
               int position=getAdapterPosition();
            }

        }
}

答案 2 :(得分:0)

使用以下代码更改您的xml:

  

使用app.put('/api/contacts/:id', (req, res) => { Button低于android:elevation=" " elivation。

CardView

RecyclerView 中使用 <?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" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:id="@+id/cvsearch" android:elevation="3dp" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:elevation="1dp" android:id="@+id/buttonsuggest" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Other Suggested Words"/> </android.support.v7.widget.CardView> 作为clickListner内部方法:

onBindViewHolder()

@Override public void onBindViewHolder(final MyViewHolder holder, final int position) { LoadDataResult listPotn = list.get(position); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Call intent or call method of Activity from here. Context context = v.getContext(); Intent intent = new Intent(context , Excercise.class); context.startActivity(intent); } }); } 类内,如下代码:

ViewHolder

或,如下代码:

  public class ViewHolder extends RecyclerView.ViewHolder {
  TextView productBtn;

ViewHolder(View itemView) {
    super(itemView);
    productBtn = (Button) itemView.findViewById(R.id.productBtn);
    itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int itemPosition = getLayoutPosition();
            Toast.makeText(getApplicationContext(), itemPosition + ":" + String.valueOf(product_name.getText()), Toast.LENGTH_SHORT).show();
        }
    });
}
}

答案 3 :(得分:0)

删除此行以下行是罪魁祸首: -

  SuggestedButton.PersonViewHolder viewHolder = new SuggestedButton.PersonViewHolder(v);  // remove this line this is the culprit

而是直接在View 上设置onClickListener : -

v.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {    
    // do something here    
  }

答案 4 :(得分:0)

通过使用接口并在父类中实现接口来实现它的正确方法。

.logo { width: 150px; }

在您使用Recycler视图的活动或片段中实现它。处理父

上的click事件