Родительский клик не запускается при повторном просмотре

У меня есть RecyclerView, который находится в CardView, который имеет пару TextView. CardView имеет набор OnClickListener и запускается при нажатии на TextViews, но не срабатывает при нажатии на RecyclerView.

Вот как выглядит CardView:

 <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp" card_view:cardCornerRadius="4dp" card_view:cardElevation="5dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:weightSum="100" android:minWidth="100dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:id="@+id/text1" android:textColor="@color/abc_primary_text_material_light" android:layout_weight="1" android:layout_gravity="center_horizontal" /> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="0dp" android:listSelector="@color/highlighted_text_material_light" android:layout_weight="98" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/black" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/relativeSummary" android:orientation="horizontal" android:layout_weight="1"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:id="@+id/text2" android:textAlignment="viewEnd" android:textColor="@color/abc_secondary_text_material_light" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:gravity="start" android:singleLine="true" android:layout_alignParentLeft="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:id="@+id/text3" android:textColor="@color/abc_primary_text_material_light" android:layout_marginRight="5dp" android:layout_marginLeft="5dp" android:gravity="end" android:singleLine="true" android:layout_alignParentRight="true" android:layout_toRightOf="@+id/text2" /> </RelativeLayout> </LinearLayout> </android.support.v7.widget.CardView> 1 <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp" card_view:cardCornerRadius="4dp" card_view:cardElevation="5dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:weightSum="100" android:minWidth="100dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:id="@+id/text1" android:textColor="@color/abc_primary_text_material_light" android:layout_weight="1" android:layout_gravity="center_horizontal" /> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="0dp" android:listSelector="@color/highlighted_text_material_light" android:layout_weight="98" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/black" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/relativeSummary" android:orientation="horizontal" android:layout_weight="1"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:id="@+id/text2" android:textAlignment="viewEnd" android:textColor="@color/abc_secondary_text_material_light" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:gravity="start" android:singleLine="true" android:layout_alignParentLeft="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:id="@+id/text3" android:textColor="@color/abc_primary_text_material_light" android:layout_marginRight="5dp" android:layout_marginLeft="5dp" android:gravity="end" android:singleLine="true" android:layout_alignParentRight="true" android:layout_toRightOf="@+id/text2" /> </RelativeLayout> </LinearLayout> </android.support.v7.widget.CardView> 

Мне не нужен прослушиватель кликов в этом RecyclerView и на самом деле требуется только событие щелчка родительского представления для запуска при нажатии на RecyclerView (То же самое касается события OnLongClick). Мне также нужен прокрутка RecyclerView. Является ли RecyclerView каким-то способом, как есть событие click и не передавать его родительскому?

Существует лучшее решение. То есть, подкласс вашего CardView :

 public class InterceptTouchCardView extends CardView { public InterceptTouchCardView(Context context) { super(context); } public InterceptTouchCardView(Context context, AttributeSet attrs) { super(context, attrs); } public InterceptTouchCardView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } /** * Intercept touch event so that inner views cannot receive it. * * If a ViewGroup contains a RecyclerView and has an OnTouchListener or something like that, * touch events will be directly delivered to inner RecyclerView and handled by it. As a result, * parent ViewGroup won't receive the touch event any longer. */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return true; } } 
 recyclerView.setLayoutFrozen(true); 

Просто setLayoutFrozen true после setAdapter для recyclerView

Я понял, как получить событие click для родителя RecyclerView. Мое решение похоже на хак, поэтому я надеюсь, что кто-то может придумать лучшее решение.

В RecylerView.Adapter:

 @Override public ViewHolder onCreateViewHolder(final ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.my_item_layout, viewGroup, false); ViewHolder viewHolder = new ViewHolder(view); viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewGroup.callOnClick(); } }); viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { return viewGroup.performLongClick(); } }); return viewHolder; } 

Затем мне пришлось подключить событие click на RecyclerView:

 RecyclerView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { parentView.callOnClick(); } }); RecyclerView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { return parentView.performLongClick(); } }); 

@ywwynm, вы на правильном пути, за исключением того, что решение не позволяет прокручивать вложенное RecyclerView. Я объединил его с решением здесь и придумал это решение для обработки событий click и onLongClick, а также для прокрутки.

 public class InterceptTouchCardView extends CardView { private GestureDetector mGestureDetector; private boolean mLongClicked; public InterceptTouchCardView(Context context) { super(context); Initialize(); } public InterceptTouchCardView(Context context, AttributeSet attrs) { super(context, attrs); Initialize(); } public InterceptTouchCardView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); Initialize(); } private void Initialize() { mGestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() { public boolean onDown(MotionEvent e) { mLongClicked = false; return true; } public void onLongPress(MotionEvent e) { mLongClicked = true; performLongClick(); } }); } /** * Intercept touch event so that inner views cannot receive it. * * If a ViewGroup contains a RecyclerView and has an OnTouchListener or something like that, * touch events will be directly delivered to inner RecyclerView and handled by it. As a result, * parent ViewGroup won't receive the touch event any longer. * * We can't Intercept the touch event if we want to allow scrolling since ACTION_DOWN always * happens before ACTION_MOVE. So handle touch events here since onTouchEvent won't be triggered. */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { mGestureDetector.onTouchEvent(ev); if (ev.getAction() == MotionEvent.ACTION_UP && !mLongClicked) this.callOnClick(); return false; } } 
Intereting Posts
Применение ARGB-цвета к текстовому виду программно Scala Android AsyncTask не будет вызывать обратный вызов publishProgress, "onProgressUpdate" Как изменить данные на другой язык, который поступает с сервера? Как изменить размер текста подсказки без изменения размера текста в EditText Ошибка. Редактирование инструментов сборки SDK (23.0.3) слишком мало для проекта «Приложение». Минимальное значение – 25.0.0 Как использовать несколько res.srcDirs и переопределить некоторые ресурсы с помощью gradle Диалоговое окно настройки, в котором есть элементы списка с одним выбором Оффлайн-запрос Android с волейболом Как добавить дату в базу данных sqlite Как сделать уведомление в андроиде? Не удалось выполнить zipalign apk android studio 2.2 Синхронизация базы данных Android IntelliJ IDEA не происходит JqPlot не отображает графики на устройствах иногда Android SDK внезапно прекратил работу Android gradle error: Невозможно зарегистрировать заданный путь типа «ИСТОЧНИК», поскольку он не соответствует корню содержимого