我的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也没关系。
按下按钮我认为可能有一些固有的方式将其点击视为独占。
答案 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事件