2016-04-21 10 views
5

Mam zamiar zadać bardzo podstawowe pytanie, ale utknąłem w nim przez długi czas.onclicklistener na konkretnej pozycji z recyclerview w Androidzie

po widoku karty istnieje recycleview który ma 2 zdjęć w każdym rzędzie. teraz chcę utworzyć detektor kliknięcia na obrazach, a nie na widok recyklingu.

odpowiedni układ (layout_main.xml) tego działania (MainActivity.java) zawiera tylko widok recyclerview. elementy każdego wiersza znajdują się w innym układzie (layout_images.xml). otrzymuję obrazy z layout_images.xml i nadmuchuję je w klasie adaptera (Adapter.java).

teraz, jak umieścić program nasłuchujący tylko na obrazach.

Po drugie, chcę uzyskać obraz, na którym kliknąłem. jak to zdobyć. jak, kiedy klikamy na widoku tworzymy jakąś metodę jako

public void onClick(View view){ 
    // some code here 
} 

gdzie widok jest obiekt, na którym kliknięty. w moim przypadku, jak uzyskać obraz, na którym kliknąłem. przy użyciu rzutowania typu może być zgłaszany wyjątek, gdy użytkownik nie kliknie obrazu.

Odpowiedz

6

Wiele zdarzeń onclick wewnątrz recyclerView:

public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener{ 

      public ImageView iconImageView; 
      public TextView iconTextView; 

      public MyViewHolder(final View itemView) { 
       super(itemView); 

       iconImageView = (ImageView) itemView.findViewById(R.id.myRecyclerImageView); 
       iconTextView = (TextView) itemView.findViewById(R.id.myRecyclerTextView); 
    // set click event 
       itemView.setOnClickListener(this); 
       iconTextView.setOnClickListener(this); 
// set long click event 
       iconImageView.setOnLongClickListener(this); 
      } 

      // onClick Listener for view 
      @Override 
      public void onClick(View v) { 

       if (v.getId() == iconTextView.getId()){ 
        Toast.makeText(v.getContext(), "ITEM PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show(); 
       } else { 
        Toast.makeText(v.getContext(), "ROW PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show(); 
       } 
      } 


      //onLongClickListener for view 
      @Override 
      public boolean onLongClick(View v) { 

       final AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext()); 
       builder.setTitle ("Hello Dialog") 
         .setMessage ("LONG CLICK DIALOG WINDOW FOR ICON " + String.valueOf(getAdapterPosition())) 
         .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 

          } 
         }); 

       builder.create().show(); 
       return true; 
      } 
     } 

dostać który element został kliknięty dopasować widok ievgetId id() = = yourViewItem.getId()

+0

dla 'v.getId() == yourViewItem.getId()' czy mogę zinterpretować 'twójViewItem jako R.id.image1?' lub muszę użyć 'findViewById()', a następnie użyć tej zmiennej do identyfikacji id 'ImageView im = (ImageView) findViewById (R.id.image1) ' ' im.getId() == v.getId' lub 'v.getId == R.id.image1' który jest prawidłowy? czy jest jakaś różnica między nimi? – Sarvesh

+0

porównać ID jak R.id.twojView, jest to wartość całkowita, gdy zdarzenie kliknięcia występuje możemy znaleźć tę wartość v.getId() metoda. v.getId == R.id.image1 (użyj tego) –

0

Można sprawdzić, czy to ze znacznikiem elementu tak:

public void onClick(View view){ 
if(view.getId() == image1.getId()) 
{ 

}else if(view.getId() == image2.getId()) 
{} 

} 
1

wdrożyć View.OnClickListener w swojej klasie ViewHolder i wdrożenie metody onClick. Następnie ustaw odbiornik kliknięć dla ImageView na ten moduł nasłuchujący. Dodaj wymaganą funkcjonalność w metodzie onClick. Jeśli chcesz zaimplementować funkcję kliknięcia w innej klasie, po prostu utwórz interfejs i zadeklaruj w nim metodę kliknięcia. Możesz zaimplementować tę metodę w działaniu/fragmencie zawierającym ten RecycleView. Następnie z widoku posiadaczy metody onClick można wywołać metodę interfejsu.

1

W Recycle View Holder, wpisz swój kod detektora onclick wewnątrz

@Override 
    public void onBindViewHolder(CardHolder holder, final int position) { 
     holder.imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //TODO 
      } 
     } 
    } 
+0

jej nie działa na me –

3

musisz ustawić onclicklistener na imageview s wewnątrz onBindViewHolder mnie TZT, patrz następujące LOCs odsyłające (kod wewnątrz onBindViewHolder metody)

holder.imageView1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //put your code for first imageview here 
      } 
    holder.imageView2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //put your code for second imageView here 
      } 
1

Przede wszystkim ustaw onclickListener siebie zobaczyć chcesz być kliknięty. Dobre miejsce do zrobienia tego w viewHolderConstructor. EG

public class GalleryManyViewHolder extends RecyclerView.ViewHolder { 

    @BindView(R.id.im_img) RoundedCornersImageView imImg; 
    @BindView(R.id.tv_title) MyTextView tvTitle; 
    @BindView(R.id.tv_label) MyTextView tvLabel; 
    @BindView(R.id.tv_date) MyTextView tvDate; 
    @BindView(R.id.im_gallery_one) RoundedCornersImageView imGalleryOne; 
    @BindView(R.id.im_gallery_two) RoundedCornersImageView imGalleryTwo; 
    @BindView(R.id.im_gallery_three) RoundedCornersImageView imGalleryThree; 
    @BindView(R.id.im_gallery_four) RoundedCornersImageView imGalleryFour; 
    @BindView(R.id.tv_more) MyTextView tvMore; 
    @BindView(R.id.root) RelativeLayout root; 

    public GalleryManyViewHolder(View view) { 
     super(view); 
     ButterKnife.bind(this, view); 
     view.setOnClickListener(onClickListener); 
     imGalleryOne.setOnClickListener(onClickListener); 
     imGalleryTwo.setOnClickListener(onClickListener); 
     imGalleryThree.setOnClickListener(onClickListener); 
     imGalleryFour.setOnClickListener(onClickListener); 
     view.setTag(this); 

    } 

Generalnie nie trzeba zrobić coś konkretnego z tych widzenia, jak ustawienie znaczników (Również niektóre biblioteki Przydatne jak Glied, który ustanawia swoje własne znaczniki do imageviews będzie działać prawidłowo, jeśli jesteś właścicielem ustawić znacznik.W dniu clickListener znaleźć pozycję adaptera widoku, aby móc sprowadzaniu odpowiednie dane

View.OnClickListener onClickListener = new View.OnClickListener() { 
    @Override public void onClick(View v) { 
     View view = v; 
     View parent = (View) v.getParent(); 
     while (!(parent instanceof RecyclerView)){ 
     view=parent; 
     parent = (View) parent.getParent(); 
     } 
     int position = recyclerView.getChildAdapterPosition(view); 
} 

jak opisano here wtedy, ale sprawdzanie ciami id, evaluete co chcesz zrobić

switch (v.getId()) { 
      case R.id.im_gallery_one: { 
       p = 0; 
      } 
      break; 
      case R.id.im_gallery_two: { 
       p = 1; 
      } 
      break; 
      case R.id.im_gallery_three: { 
       p = 2; 
      } 
      break; 
      case R.id.im_gallery_four: { 
       p = 3; 
      } 
      break; 
      } 
Powiązane problemy