У меня есть представление ресайклера, и я хочу вернуть позицию в списке, по которой щелкнули. Я попытался установить 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
Просто удалите стиль из своего xml, а затем попробуйте свой метод. Ваш метод прав, поэтому он работает после удаления стиля в xml.




Используйте Бревно и посмотрите результат в 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);
}
});
}
Попробуйте код ниже, он должен работать.
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;
}
}
Надеюсь, ты понял.
В держателе представления зарегистрировано несколько прослушивателей кликов. Возможно, щелчок потребляется одним из других слушателей. Поместите некоторые другие операторы ведения журнала или строки System.out в эти другие прослушиватели щелчков, чтобы увидеть, не в этом ли проблема.