I am trying to drag a recyclerview item after long pressing it to activate dragging. However, the onTouch() of the parent layout of the recyclerview item is not being called. I read from a post also asking about their onTouch not being called, and I set the android:clickable and android:focusable properties of the CardView (the only direct child element inside the parent ConstraintLayout which i attached an OnTouchListener to) to false, but the OnTouch is still not called.
fragment_locations.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".views.LocationsFragment"
android:clipToPadding="false"
android:id="@+id/locations_fragment_parent_layout">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_locations"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingHorizontal="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.74"
android:clipToPadding="false"/>
</androidx.constraintlayout.widget.ConstraintLayout>
location_item.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/location_rv_item_layout"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginHorizontal="6dp"
>
<androidx.cardview.widget.CardView
android:id="@+id/location_rv_item_card"
android:layout_width="410dp"
android:layout_height="700dp"
android:clickable="false"
android:elevation="50dp"
android:focusable="false"
app:cardBackgroundColor="@color/cardview_shadow_end_color"
app:cardCornerRadius="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/location_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="10dp"
android:paddingTop="30dp"
android:paddingHorizontal="24dp"
android:maxLines="3"
android:ellipsize="end"
android:fontFamily="@font/roboto_condensed_bold"
android:gravity="center"
android:textAppearance="@style/TextAppearance.AppCompat.Caption"
android:textSize="40sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="Location xyzxyzxyzxyz xasnxsaaskjdnasdjjkasjasd asdasd" />
<ImageView
android:id="@+id/location_image"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_gravity="center"
android:layout_marginHorizontal="16dp"
android:background="@drawable/border_for_image_in_locations_rv"
android:scaleType="centerInside"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="190dp"/>
<TextView
android:id="@+id/location_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingHorizontal="20dp"
android:ellipsize="end"
android:fontFamily="@font/roboto_condensed_regular"
android:gravity="center"
android:maxLines="8"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/location_image"
tools:text="Descriptionxyxyyxyxyxyxyyxyxyxyxyyxyxyyxyxyxyyxyxyxyxyyxyxyxyyxyxyxyxyxyyxyxyxyyxyxyyxyxyxyxyyxyxyxyxy asjidojiaosdjioasiojdiojasdijoasiojdiojasdijoaisjod saidojasjiodoijsaasoidjoiajsdasoidijsad asdioasjioasoidjaijosdiaojsaoisdjaosijdioasjdioaaiosjdioasiojdioasdjioadio xuiasudhuiahiuxhauish xhauishdiuashdiuahs xuaishuiahxui asduhaisudhasui xasuhduiahdiuash" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
LocationsAdapter.java
/**
* Adapter for the recycler view in LocationsFragment
*/
public class LocationsAdapter extends RecyclerView.Adapter<LocationsAdapter.LocationViewHolder> {
private List<LocationResource> savedLocations;
private OnLocationItemClickListener onLocationItemClickListener;
private Context context;
private final OnDragStartListener onDragStartListener;
private final OnDragFinishListener onDragFinishListener;
public interface OnDragStartListener {
void onDragStarted(RecyclerView.ViewHolder viewHolder);
}
public interface OnDragFinishListener {
void onDragFinished(Map<String,Integer> newPositionsMap);
}
public LocationsAdapter(Context context, OnLocationItemClickListener onLocationItemClickListener, OnDragStartListener onDragStartListener, OnDragFinishListener onDragFinishListener) {
this.context = context;
this.onLocationItemClickListener = onLocationItemClickListener;
this.onDragStartListener = onDragStartListener;
this.onDragFinishListener = onDragFinishListener;
}
@Override
public int getItemViewType(int position) {
return R.layout.location_item;
}
@NotNull
@Override
public LocationViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(viewType, parent, false);
return new LocationViewHolder(view);
}
@SuppressLint("ClickableViewAccessibility")
@Override
public void onBindViewHolder(@NotNull LocationViewHolder holder, int position) {
holder.mLocationCardLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
onDragStartListener.onDragStarted(holder);
return true;
} else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
onDragFinishListener.onDragFinished(locationNameToViewholderPositionMap);
return false;
}
return false;
}
});
}
@Override
public int getItemCount() {
return savedLocations.size();
}
public class LocationViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private CardView mLocationCard;
private ConstraintLayout mLocationCardLayout;
public LocationViewHolder(@NotNull View itemView) {
super(itemView);
mLocationCard = itemView.findViewById(R.id.location_rv_item_card);
mLocationCard.setOnClickListener(this);
mLocationCardLayout = itemView.findViewById(R.id.location_rv_item_layout);
}
@Override
public void onClick(View v) {
int clickedPosition = getAbsoluteAdapterPosition();
onLocationItemClickListener.OnLocationItemClick(clickedPosition);
}
}
}