简体   繁体   English

在RecyclerView适配器中,如何在活动中修改onClickListener

[英]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. 当然, cancelButtonsaveButtoncancelButton 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. 基本上,我想从适配器“添加”到saveButtoncancelButton ,同时在活动中保持其原始功能。

Edit: saveButton and cancelButton are only defined in the activity, but not in the adapter. 编辑: saveButtoncancelButton仅在活动中定义,而不在适配器中定义。

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.

相关问题 RecyclerView Adapter,活动内片段上的OnclickListener - RecyclerView Adapter, OnclickListener on a fragment inside an activity 如何从 recyclerView 的 onClickListener 的活动中打开片段 - How do i open a fragment from an activity from the onClickListener of a recyclerView 如何将OnClickListener添加到ListView适配器内的按钮? - How do I add an OnClickListener to a button inside a ListView adapter? 我如何检测在RecyclerView适配器中是否单击了活动中的按钮 - How do I detect if a button from an activity is clicked while inside a RecyclerView adapter 适配器内部的RecyclerView onItemClickListener和View.onClickListener - RecyclerView onItemClickListener and View.onClickListener inside adapter 如何在 RecyclerView 中添加 OnClickListener 和动画? - How do I add an OnClickListener And An Animation In A RecyclerView? 如何在其适配器的onBindViewHolder中更新recyclerView? - How do I update recyclerView inside onBindViewHolder of its adapter? 从RecyclerView内的onClickListener开始活动 - Starting activity from onClickListener inside RecyclerView 在适配器类外的 Activity 中定义 RecyclerView 的 onCLickListener - Defining a RecyclerView's onCLickListener in an Activity outside the adapter class RecyclerView Adapter 中的 OnClickListener 未初始化 - OnClickListener in RecyclerView Adapter not initialized
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM