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



在我的主要活动(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();
        }
    });
}

我在适配器的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();
        }
    }
});

当然,onBindViewHolder内部的 saveButtoncancelButton onClickListeners 不起作用,这就是我想要做的。我还想在showEditField方法中保留在实际的 onClickListeners 中调用的方法。基本上,我想从适配器"添加"saveButtoncancelButton onClickListeners,同时在活动中保持其原始功能。

编辑:saveButtoncancelButton仅在活动中定义,而不在适配器中定义。

你可以这样做

在适配器中创建接口

public interface customButtonListener {
     void onButtonClickListner(int position, View view,int pos);
}

和一种方法

public void setCustomButtonListner(customButtonListener listener) {
        this.customListner = listener;
    }

然后在适配器中声明一个变量

private customButtonListener customListner;

然后在适配器中为按钮设置单击侦听器

 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);
                }
            }
        });

然后在您的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
       }
    }

您可以创建一个实现RecyclerView.OnItemTouchListenerRecyclerViewItemOnClickListener检查以下代码片段 -

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) {
    }
}

在代码中使用它非常简单。只需将此类的项目触摸侦听器添加到回收器视图:

recyclerView.addOnItemTouchListener(  
    new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
      @Override public void onItemClick(View view, int position) {
        // TODO Handle item click
      }
    })
);

最新更新