2016-04-21 2 views
5

Я собираюсь задать очень простой вопрос, но я застрял в нем в течение длительного времени.onclicklistener по конкретному элементу recyclerview в android

после того, как карты зрения есть recycleview, который имеет 2 изображения в каждой строке. теперь я хочу создать прослушиватель кликов на изображениях, а не на recycleview.

соответствующий макет (layout_main.xml) этого действия (MainActivity.java) содержит только recyclerview. элементы каждой строки находятся в другом макете (layout_images.xml). Я получаю изображения из layout_images.xml и раздуваю их в классе адаптера (Adapter.java).

сейчас, как установить исполнитель действия только на изображения.

Во-вторых, я хочу получить изображение, на которое я нажал. как это получить. как, когда мы нажимаем на вид мы создаем какой-то метод, как

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

, где точка зрения объект, на котором мы щелкнули. в моем случае, как получить изображение, на которое я нажал. с использованием типа cast это может быть исключение, если пользователь не нажимает на изображение.

ответ

6

Несколько событий OnClick внутри 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; 
      } 
     } 

Чтобы получить какой элемент был щелкнул вы подходите вид идентификатора ievgetId() = = yourViewItem.getId()

+0

для 'v.getId() == yourViewItem.getId()' Могу ли я интерпретировать 'yourViewItem как R.id.image1?' или мне нужно использовать 'findViewById()', а затем использовать эту переменную для соответствия идентификатора 'ImageView im = (ImageView) findViewById (R.id.image1); ' ' im.getId() == v.getId' или 'v.getId == R.id.image1' какой из них правильный? есть ли разница между обоими? – Sarvesh

+0

сравнить ID, например, R.id.yourView, это целочисленное значение при возникновении события click, мы можем найти это значение v.getId(). v.getId == R.id.image1 (используйте это) –

0

Вы можете проверить с тегом или элемента, как это:

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

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

} 
1

реализовать View.OnClickListener в своем классе ViewHolder и реализовать метод onClick. Затем установите прослушиватель кликов для вашего ImageView на этот прослушиватель кликов. Добавьте необходимые функции в метод onClick. Если вы хотите реализовать функцию щелчка в другом классе, просто создайте интерфейс и объявите в нем метод кликов. Вы можете реализовать этот метод в активности/фрагменте, который содержит этот RecycleView. Затем из вашего метода просмотра onClick вы можете вызвать метод интерфейса.

1

В Recycle View Holder напиши свой OnClick код слушателя внутри

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

ее не работает для me –

3

вы должны установить onclicklistener на imageview с внутри onBindViewHolder me ThOD см следующие Locs для справки (код быть внутри onBindViewHolder метода)

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

Прежде всего установить onclickListener для каждого просмотра вы хотите, чтобы быть нажата. Хорошее место, чтобы сделать это в 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); 

    } 

Обычно вам не нужно делать ничего конкретного с теми точки зрения, как установка метки (Также некоторые Полезные библиотеки Glied, который устанавливает свои собственные теги imageviews будет работать неправильно, если вы установите у вас есть тег.В на clickListener найти адаптер положение зрения, чтобы иметь возможность retrive соответствующие данные

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

, как описано here Тогда но проверка просмотры идентификатор, evaluete то, что вы хотите сделать

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; 
      } 
Смежные вопросы