[英]In a RecyclerView adapter, how do I modify an onClickListener inside an activity
In my main activity ( CreatePhotostoryActivity
), I have this method: 在我的主要活动(
CreatePhotostoryActivity
)中,我有以下方法:
public void showEditField(Moment oldMoment, final int index){
listRecycler.setVisibility(View.GONE);
editCaption.setVisibility(View.VISIBLE);
saveCancelNavbar.setVisibility(View.VISIBLE);
momentView.setVisibility(View.GONE);
photoStoryNavbar.setVisibility(View.GONE);
header.setVisibility(View.GONE);
Picasso.with(getApplicationContext()).load(oldMoment.photoUri).into(displayPhoto);
imageCaption.setText("");
imageCaption.setText(oldMoment.caption);
backIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
closeEditMoment();
}
});
saveText.setText("Save Moment");
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateMoment(imageCaption.getText().toString(), index);
}
});
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
closeEditMoment();
}
});
}
I call showEditField
in the onBindViewHolder
method of my adapter like this: 我在适配器的
onBindViewHolder
方法中调用showEditField
,如下所示:
final RecyclerView.ViewHolder holder= (RecyclerView.ViewHolder)momentViewHolder;
((MomentViewHolder) momentViewHolder).momentCaption.setText(moments.get(i).caption);
Picasso.with(mContext).load(moments.get(i).photoUri).into(((MomentViewHolder) momentViewHolder).displayPhoto);
((RecyclerView.ViewHolder) momentViewHolder).itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mContext instanceof CreatePhotostoryActivity) {
((CreatePhotostoryActivity) mContext).showEditField(moments.get(position), position);
// this is what I want to implement
saveButton.setOnClickListener(new View.OnClickListener () {
holder.momentCaption.setText(moments.get(position).caption);
holder.momentPlaceholder.setVisibility(View.GONE);
holder.momentCaption.setVisibility(View.VISIBLE);
});
cancelButton.setOnClickListener(new View.OnClickListener () {
holder.momentPlaceholder.setVisibility(View.VISIBLE);
holder.momentCaption.setVisibility(View.GONE);
})
notifyDataSetChanged();
}
}
});
Of course, the saveButton
and cancelButton
onClickListeners inside onBindViewHolder
are not working and that's what I'm trying to do. 当然,
cancelButton
的saveButton
和cancelButton
onBindViewHolder
不能正常工作,这就是我要尝试的方法。 I also want to keep the methods called in the actual onClickListeners in the showEditField
method. 我还想将在实际的
showEditField
调用的方法保留在showEditField
方法中。 Basically, I want to "add" to saveButton
and cancelButton
onClickListeners from the adapter while maintaining its original functionality in the activity. 基本上,我想从适配器“添加”到
saveButton
和cancelButton
,同时在活动中保持其原始功能。
Edit: saveButton
and cancelButton
are only defined in the activity, but not in the adapter. 编辑:
saveButton
和cancelButton
仅在活动中定义,而不在适配器中定义。
You can create a RecyclerViewItemOnClickListener
which implements RecyclerView.OnItemTouchListener
Check the below code snippets - 您可以创建一个
RecyclerViewItemOnClickListener
它实现RecyclerView.OnItemTouchListener
检查下面的代码片段-
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;
public interface OnItemClickListener {
public void onItemClick(View view, int position);
}
GestureDetector mGestureDetector;
public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
}
Using it in code is very simple. 在代码中使用它非常简单。 Just add an item touch listener of this class to the RecyclerView:
只需将此类的项目触摸侦听器添加到RecyclerView:
recyclerView.addOnItemTouchListener(
new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
@Override public void onItemClick(View view, int position) {
// TODO Handle item click
}
})
);
You can do it like this 你可以这样
create an interface in your Adapter 在适配器中创建接口
public interface customButtonListener {
void onButtonClickListner(int position, View view,int pos);
}
and a method 和方法
public void setCustomButtonListner(customButtonListener listener) {
this.customListner = listener;
}
then declare a variable in the adapter 然后在适配器中声明一个变量
private customButtonListener customListner;
then set click listeners for your buttons in adapter 然后为适配器中的按钮设置点击监听器
holder.saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (customListner != null) {
int pos=1;
customListner.onButtonClickListner(position, view,pos);
}
}
});
holder.cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (customListner != null) {
int pos=2;
customListner.onButtonClickListner(position, view, pos);
}
}
});
then in your CreatePhotostoryActivity
implement YourAdapter.customButtonListener
and then do the following: 然后在您的
CreatePhotostoryActivity
实现YourAdapter.customButtonListener
,然后执行以下操作:
yourAdapterobj.setCustomButtonListner(CreatePhotostoryActivity.this);
@Override
public void onButtonClickListner(int position, View view, int pos) {
if(pos==1) {
//code for save button
}
else if(pos==2){
//code for cancel button
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.