RecyclerView itemView.setOnClick Listener не работает

У меня есть представление ресайклера, и я хочу вернуть позицию в списке, по которой щелкнули. Я попытался установить OnClickListener в itemView, но, похоже, это не срабатывает при нажатии на него

Я попытался установить OnClickListener внутри метода ViewHolder, но это тоже не сработало.

    @Override
public void onBindViewHolder(HomeAdapter.HomeViewHolder holder, final int position) {
    holder.evacName.setText(evacNames.get(position).toString());
    holder.editTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        }
    });

    holder.deleteTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        }
    });

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            System.out.println("CLICKED ROW " + position);
        }
    });
}

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

class HomeViewHolder extends RecyclerView.ViewHolder{

    TextView evacName;
    TextView editTextView;
    TextView deleteTextView;

    public HomeViewHolder(View itemView) {
        super(itemView);

        evacName = itemView.findViewById(R.id.evacProcedureTextView);
        editTextView = itemView.findViewById(R.id.editTextView);
        deleteTextView = itemView.findViewById(R.id.deleteTextView);

        swipeLayout = (SwipeLayout) itemView.findViewById(R.id.swipeLayout);

        swipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown);

        swipeLayout.addDrag(SwipeLayout.DragEdge.Left, itemView.findViewById(R.id.bottom_wrapper));

        swipeLayout.addSwipeListener(new SwipeLayout.SwipeListener() {
            @Override
            public void onClose(SwipeLayout layout) {
                //when the SurfaceView totally cover the BottomView.
            }

            @Override
            public void onUpdate(SwipeLayout layout, int leftOffset, int topOffset) {
                //you are swiping.
            }

            @Override
            public void onStartOpen(SwipeLayout layout) {

            }

            @Override
            public void onOpen(SwipeLayout layout) {
                //when the BottomView totally show.
            }

            @Override
            public void onStartClose(SwipeLayout layout) {

            }

            @Override
            public void onHandRelease(SwipeLayout layout, float xvel, float yvel) {
                //when user's hand released.
            }
        });
    }
}

При нажатии на строку я ожидаю увидеть позицию строки, выбранной через System.out

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

Greg Moens 23.12.2018 06:16

Просто удалите стиль из своего xml, а затем попробуйте свой метод. Ваш метод прав, поэтому он работает после удаления стиля в xml.

Hardik Vaghasiya 26.12.2018 12:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
942
4

Ответы 4

Используйте Бревно и посмотрите результат в Android Studio LogCat:

holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.v("Your Filter", "CLICKED ROW " + position);
        }
    });

Проверьте это для получения дополнительной информации о Log и System.out в Android.

Я прочитал ваш вопрос и внедрил его в свой проект. я нашел проблему и ее решение. в recyclerview onclick listener работает только с элементом, это означает, что вы пробуете прослушиватель onclick на itemveiw, а также просмотреть, щелкнуть его не работает, потому что оба они похожи. в этой ситуации onclick работает только для первого представления (editTextView), если вы печатаете postion в edittextview onclicklistener, его печать, потому что его реализация выполняется сначала.

пожалуйста, посмотрите этот код и снимок экрана.

@Override
public void onBindViewHolder(@NonNull Myholder myholder, final int i) {

    myholder.text.setText(name[i]);



     myholder.text.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            System.out.println("check click: "+i);
            Log.e(TAG+"check_clcik_view:",""+i);

        }
    });
    myholder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            System.out.println("check item view click:"+i);
            Log.e(TAG+"check_clcik_item:",""+i);
        }
    });

}

screen shot

Попробуйте код ниже, он должен работать.

  class HomeViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{  // implementing  View.OnClickListener will handle all click event's inside the holder and will keep your code also clean

      TextView evacName;
      TextView editTextView;
      TextView deleteTextView;

      public HomeViewHolder(View itemView) {
          super(itemView);

          evacName = itemView.findViewById(R.id.evacProcedureTextView);
          editTextView = itemView.findViewById(R.id.editTextView);
          deleteTextView = itemView.findViewById(R.id.deleteTextView);

          swipeLayout = (SwipeLayout) itemView.findViewById(R.id.swipeLayout);

          swipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown);

          swipeLayout.addDrag(SwipeLayout.DragEdge.Left, itemView.findViewById(R.id.bottom_wrapper));

          swipeLayout.addSwipeListener(new SwipeLayout.SwipeListener() {
              @Override
              public void onClose(SwipeLayout layout) {
                  //when the SurfaceView totally cover the BottomView.
              }

              @Override
              public void onUpdate(SwipeLayout layout, int leftOffset, int topOffset) {
                  //you are swiping.
              }

              @Override
              public void onStartOpen(SwipeLayout layout) {

              }

              @Override
              public void onOpen(SwipeLayout layout) {
                  //when the BottomView totally show.
              }

              @Override
              public void onStartClose(SwipeLayout layout) {

              }

              @Override
              public void onHandRelease(SwipeLayout layout, float xvel, float yvel) {
                  //when user's hand released.
              }
          });
      }

    @Override
    public void onClick(final View view) {
       //you can handle any type of even specifically for `deleteTextView` or itemView`
       Log.v("Your Filter", "CLICKED ROW " + getAdapterPosition());
    }
  }    

Примечание: В соответствии с вашим требованием вы хотите добавить слушателя к держателю, а не deleteTextView или itemView. Установка двух ClickListener на самом деле чрезмерно усложняет вашу логику, которую можно легко обрабатывать внутри HomeViewHolder

holder.deleteTextView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

    }
});

holder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {   
     Log.v("Your Filter", "CLICKED ROW " + getAdapterPosition());
    }
});

вы можете инициализировать любой родительский макет и использовать метод onclick, я дам вам пример:

<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
          xmlns:tools = "http://schemas.android.com/tools"
          android:layout_width = "match_parent"
          android:layout_height = "wrap_content"
          android:layout_marginLeft = "@dimen/activity_horizontal_margin"
          android:layout_marginStart = "@dimen/activity_horizontal_margin"
          android:layout_marginBottom = "10dp"
          android:orientation = "vertical"
android:id = "@+id/mMessagelayout">

<ImageView
    android:id = "@+id/photoImageView"
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content"
    android:adjustViewBounds = "true" />

<LinearLayout
    android:layout_width = "wrap_content"
    android:orientation = "vertical"
    android:background = "@drawable/chat_style"
    android:backgroundTint = "#f3e5f5"
    android:layout_gravity = "start"
    android:padding = "20dp"
    android:layout_height = "wrap_content"
    >
    <TextView

        android:id = "@+id/messageTextView"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_marginEnd = "10dp"
        android:layout_marginRight = "10dp"
        android:layout_weight = "0"
        android:textColor = "#000"
        android:textAppearance = "?android:attr/textAppearanceLarge"
        tools:text = "Message" />

    <TextView
        android:id = "@+id/nameTextView"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_weight = "0"

        android:textAppearance = "?android:attr/textAppearanceSmall"
        tools:text = "Name" />
</LinearLayout>

Это был мой макет xml для каждого элемента в recyclerview и вот мой код адаптера:

public static class SentMessages extends RecyclerView.ViewHolder{
    TextView text,name;
    LinearLayout mParent;
    public SentMessages(View itemView) {
        super(itemView);
        text= (TextView) itemView.findViewById(R.id.messageTextView);
        name= (TextView) itemView.findViewById(R.id.nameTextView);
        mParent= (LinearLayout) itemView.findViewById(R.id.mMessagelayout);
    }



 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    final FriendlyMessage friendlyMessage=messages.get(position);
    switch (friendlyMessage.getType()){
        case FriendlyMessage.CHAT_TYPE_SENT:
            ((SentMessages)holder).name.setText(friendlyMessage.getName());
            ((SentMessages)holder).text.setText(friendlyMessage.getText());
            ((SentMessages)holder).mParent.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {

                    Toast.makeText(context,"Message :"+friendlyMessage.getText(),Toast.LENGTH_LONG).show();
                    return false;
                }
            });
            break;
    }
}

Надеюсь, ты понял.

Другие вопросы по теме