2016-06-11 26 views
5

Ich habe einen RecyclerView.ViewHolder und RecyclerView.Adapter, ich brauche nach dem Klicken auf Artikel und dann senden Sie Informationen über diesen Artikel an einen anderen Activity.onClickListener in RecyclerView.ViewHolder

PlacesAdapter.java

public class PlacesAdapter extends RecyclerView.Adapter<PlacesViewHolder> { 
private PlacesActivity placesActivity; 

    Context context; 
    private int position; 
    List<Places> places; 

    public PlacesAdapter(List<Places> places) { 
     this.places = places;} 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    @Override 
    public PlacesViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.places_view, viewGroup, false); 
     PlacesViewHolder pvh = new PlacesViewHolder(v); 
     return pvh; 
    } 

    @Override 
    public void onBindViewHolder(PlacesViewHolder personViewHolder, int i) { 
     personViewHolder.name.setText(places.get(i).name); 
     personViewHolder.address.setText(places.get(i).address); 
     Picasso.with(personViewHolder.itemView.getContext()) 
       .load(places.get(i).photo) 
       .into(personViewHolder.getPhoto()); 
     } 

    @Override 
    public int getItemCount() { 
     return places.size(); 
    } 

} 

PlacesViewHolder.java

In dieser Zeile "intent.putExtra(PlacesDetail.PLACES_NAME,);" Wie kann ich Namen senden?

public class PlacesViewHolder extends RecyclerView.ViewHolder { 

    CardView cv; 
    public TextView name; 
    public TextView address; 
    public ImageView photo; 
    public PlacesViewHolder(final View itemView) { 
     super(itemView); 
     cv = (CardView)itemView.findViewById(R.id.cv); 
     name = (TextView)itemView.findViewById(R.id.person_name); 
     address = (TextView)itemView.findViewById(R.id.person_age); 
     photo = (ImageView)itemView.findViewById(R.id.person_photo); 

     itemView.setOnClickListener(new View.OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       Context context = v.getContext(); 
       Intent intent = new Intent(context, PlacesDetail.class); 
       intent.putExtra(PlacesDetail.PLACES_NAME,); 
       context.startActivity(intent); 
      } 
     }); 

    } 

    public TextView getAddress() { 
     return address; 
    } 

    public TextView getName() { 
     return name; 
    } 
    public ImageView getPhoto() { 
     return photo; 
    } 
} 
+0

Einfach gesagt 'Platz 'Element als ein Feld in Viewholder. –

+0

Eine andere Möglichkeit besteht darin, die Position des Objekts aus dem Viewholder zu holen und das Objekt von den Orten –

+0

zu erhalten, verwenden Sie die Kartenansicht und dann den Wert cardView.setOnClickListener (neue Ansicht.OnClickListener() und übergeben Sie die Werte durch gemeinsame Präferenz oder Absicht, was auch immer Sie wollen –

Antwort

0

Sie können dies erreichen, indem eine Schnittstelle in Ihrem Adapter für eine itemclicklistener erstellen und dann können Sie onItemClickListener von Ihrem PlacesActivity gesetzt.

Irgendwo in Ihrem PlacesAdapter Sie die folgende müssten:

private onRecyclerViewItemClickListener mItemClickListener; 

public void setOnItemClickListener(onRecyclerViewItemClickListener mItemClickListener) { 
     this.mItemClickListener = mItemClickListener; 
    } 

    public interface onRecyclerViewItemClickListener { 
     void onItemClickListener(View view, int position, String places_name); 
    } 

Then (als innere Klasse in meinem Adapter hinzugefügt, die ich habe) in Ihrem ViewHolder, können Sie den Hörer auf die Komponenten anwenden würden Sie‘ d wie der Benutzer klicken, etwa so:

class PlacesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     PlacesViewHolder(View view) { 
      super(view); 
      view.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      if (mItemClickListener != null) { 
       mItemClickListener.onItemClickListener(v, getAdapterPosition(), PlacesDetail.PLACES_NAME); 
      } 
     } 
    } 

Dieses Beispiel zeigt eine onClickListener innen PlacesViewHolder auf die Ansicht angewendet wird.

recyclerView.setAdapter(adapter);// set adapter on recyclerview 
      adapter.notifyDataSetChanged();// Notify the adapter 
      adapter.setOnItemClickListener(new PlacesAdapter.onRecyclerViewItemClickListener() { 
       @Override 
       public void onItemClickListener(View view, int position, String places_name) { 
//perform click logic here (places_name is passed) 
        } 
       }); 

diesen Code zu implementieren, Sie würden setOnItemClickListener zu Ihrem Adapter innerhalb PlacesActivity wie oben gezeigt.

1

Dies ist das vollständige Beispiel für benutzerdefinierte Adapter, wo ich die Details bestimmter Elemente erhalten kann. In MainActivity müssen Sie den Adapter setzen:

adapter = new MyAdapter(getApplicationContext(), account_no, title, aFN1, aLN1,aFN2, aLN2,aFN3, aLN3,isavilable,waitlist,flag); 
          adapter.notifyDataSetChanged(); 
          mRecyclerView.setAdapter(adapter); 

nun den Code für den benutzerdefinierten Adapter sehen:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 
    String TAG = "MyAdapter"; 
    Context context; 
    private String[] accountNo; 
    private String[] title; 
    private String[] afn1; 
    private String[] aln1; 
    private String[] afn2; 
    private String[] aln2; 
    private String[] afn3; 
    private String[] aln3; 
    private String[] isAvailable; 
    private String[] waitlist; 
    private int flag; 
public static class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView account_no,title,afn1,afn2,aln1,aln2,color,is_available; 
     private ImageView img_android; 
     CardView cardView; 
     public ViewHolder(CardView v) { 
      super(v); 
      account_no = (TextView)v.findViewById(R.id.acctno); 
      title = (TextView)v.findViewById(R.id.title); 
      afn1 = (TextView) v.findViewById(R.id.afn1); 
      cardView = v; 
     } 
    } 
    // Provide a suitable constructor (depends on the kind of dataset) 
    public MyAdapter(Context context, String[] accountNo,String[] title,String[] afn1,String[] aln1,String[] afn2,String[] aln2,String[] afn3,String[] aln3,String[] isAvailable, String[] waitlist,int flag) { 
     this.context = context; 
     this.accountNo = accountNo; 
     this.title = title; 
     this.afn1 = afn1; 
     this.aln1 = aln1; 
     this.afn2 = afn2; 
     this.aln2 = aln2; 
     this.afn3 = afn3; 
     this.aln3 = aln3; 
     this.isAvailable = isAvailable; 
     this.waitlist = waitlist; 
     this.flag = flag; 
     Log.d(TAG,afn1.toString() +aln1+afn2+aln2+afn3+aln3.toString()+waitlist); 
    } 
    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { 
     CardView cv = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); 
     return new ViewHolder(cv); 
    } 
    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     final CardView cardView = holder.cardView; 
     final TextView accountno = (TextView)cardView.findViewById(R.id.acctno); 
     accountno.setText(accountNo[position]); 
     final TextView titletxt = (TextView)cardView.findViewById(R.id.title); 
     titletxt.setText(title[position]); 
     final TextView afn1txt = (TextView) cardView.findViewById(R.id.afn1); 
     afn1txt.setText(afn1[position]+" "+aln1[position]); 
     Log.d(TAG,waitlist[position]); 
     cardView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int id = getItemViewType(position); 
       SharedPreferences sharedPreferences = context.getSharedPreferences(Constant.MYPREFERENCE,Context.MODE_PRIVATE); 
       SharedPreferences.Editor edit = sharedPreferences.edit(); 
       edit.putString(Constant.ACCOUNT,accountNo[position]); 
       edit.putString(Constant.TITLE,title[position]); 
       edit.putString(Constant.AFN1,afn1[position]); 
       edit.putString(Constant.ALN1,aln1[position]); 
       edit.putString(Constant.AFN2,afn2[position]); 
       edit.putString(Constant.ALN2,aln2[position]); 
       edit.putString(Constant.AFN3,afn3[position]); 
       edit.putString(Constant.ALN3,aln3[position]); 
       edit.putBoolean(Constant.IS_AVAILABLE, Boolean.parseBoolean(isAvailable[position].toUpperCase())); 
       edit.putString(Constant.WAITLIST,waitlist[position]); 
       Log.d("WaitingNo2 :",""+String.valueOf(waitlist[position])); 
       edit.commit(); 
       Intent intent = new Intent(v.getContext(), DetailsActivity.class); 
       v.getContext().startActivity(intent); 
      } 
     }); 
    } 

    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return accountNo.length; 
    } 
} 

Danach Alle den Wert von sharedPreferences in der Aktivität erhalten, die auf Karte Klicken genannt wird:

preferences = getSharedPreferences("myshared", Context.MODE_PRIVATE); 
AccountNo = sharedPreferences.getString(Constant.ACCOUNT,null).toUpperCase(); 
      title = sharedPreferences.getString(Constant.TITLE,null).toUpperCase(); 
      afn1 = sharedPreferences.getString(Constant.AFN1,null).toUpperCase(); 
      aln1 = sharedPreferences.getString(Constant.ALN1,null).toUpperCase(); 
      afn2 = sharedPreferences.getString(Constant.AFN2,null).toUpperCase(); 
      aln2 = sharedPreferences.getString(Constant.ALN2,null).toUpperCase(); 
      afn3 = sharedPreferences.getString(Constant.AFN3,null).toUpperCase(); 
      aln3 = sharedPreferences.getString(Constant.ALN3,null).toUpperCase(); 
      isAvailable = sharedPreferences.getBoolean(Constant.IS_AVAILABLE,isAvailable); 
      waitlist = sharedPreferences.getString(Constant.WAITLIST,waitlist); 

Jetzt machen Sie was Sie wollen und genießen Sie den Code.

-1

versuchen dies, dann ist es die Arbeit mit mir richtig

Erstellen Sie eine neue Klasse und diesen Code

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { 
private OnItemClickListener mListener; 

public interface OnItemClickListener { 
    public void onItemClick(View view, int position); 

    public void onLongItemClick(View view, int position); 
} 

GestureDetector mGestureDetector; 

public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) { 
    mListener = listener; 
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      return true; 
     } 

     @Override 
     public void onLongPress(MotionEvent e) { 
      View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
      if (child != null && mListener != null) { 
       mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child)); 
      } 
     } 
    }); 
} 

@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 true; 
    } 
    return false; 
} 

@Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } 

@Override 
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){} 
} 

Und in Ihrer Aktivität dieser

Implementierung zu Ihrem Adapter hinzufügen
mRecyclerView.addOnItemTouchListener(
    new RecyclerItemClickListener(getActivity(), mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() { 
@Override 
public void onItemClick(View view, int position) { 
    // do something 
    } 
    } 
    } 

@Override 
public void onLongItemClick(View view, int position) { 
    // do whatever 
    } 
    }) 
    ); 
+0

@Alice überprüfen Sie meine Antwort –