2017-11-07 5 views
0

In meiner Haupttätigkeit (CreatePhotostoryActivity) eine OnClickListener innerhalb einer Aktivität ändern, habe ich diese Methode:In einem RecyclerView Adapter, wie kann ich

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 showEditField im onBindViewHolder Methode meiner Adapter wie folgt aufrufen:

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

natürlich ist der saveButton und cancelButton onClickListeners innerhalb onBindViewHolder funktioniert nicht, und das ist, was ich versuche zu tun. Ich möchte auch die Methoden beibehalten, die in den tatsächlichen onClickListeners in der Methode showEditField aufgerufen werden. Im Grunde möchte ich und cancelButton onClickListeners von dem Adapter "hinzufügen" unter Beibehaltung seiner ursprünglichen Funktionalität in der Aktivität.

Bearbeiten: saveButton und cancelButton sind nur in der Aktivität definiert, aber nicht im Adapter.

Antwort

0

Sie können es wie diese

tun, um eine Schnittstelle in Ihrem Adapter

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

und ein Verfahren schaffen

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

dann deklarieren Sie eine Variable im Adapter

set
private customButtonListener customListner; 

dann Hörer in Adapter für Ihre Schaltflächen klicken

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

      } 
     }); 

dann in Ihrem CreatePhotostoryActivityYourAdapter.customButtonListener implementieren und dann wie folgt vor: in der

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 

     } 

    } 
+0

Wo gebe ich diese an? 'holder.momentCaption.setText (moments.get (Position) .Caption);' ' holder.momentPlaceholder.setVisibility (View.GONE);' ' holder.momentCaption.setVisibility (View.VISIBLE);' ' – Bargain23

+0

saveButton 'und' cancelButton' sind nur in der Aktivität definiert – Bargain23

+0

Sie können Bezug auf die Schaltflächen im Adapter mit 'Button saveButton = (Button) convertView.findViewById (R.id.saveButton);' –

0

können Sie ein RecyclerViewItemOnClickListener schaffen, die RecyclerView.OnItemTouchListener Überprüfen Sie die folgenden Code-Schnipsel implementiert -

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

es im Code ist sehr einfach. ein Element berühren Hörer dieser Klasse zum RecyclerView nur hinzufügen:

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

finde ich den Artikel Touch-Hörer setzen Aktivität? – Bargain23

+0

'MomentCaption' und' MomentPlaceHolder' sind nur im Adapter verfügbar. – Bargain23

+0

Ja, Sie müssen es an Ihrem RecyclerView anhängen – hsm59

Verwandte Themen