android - 拖动项目时未调用 onTouch()
问题描述
我试图在长按激活拖动后拖动一个 recyclerview 项目。但是,onTouch()
没有调用 recyclerview 项目的父布局。我从一篇帖子中读到,也询问他们onTouch
没有被调用,并且我将CardView(父 ConstraintLayout 内的唯一直接子元素,我附加了 OnTouchListener 的唯一直接子元素)的android:clickable
和属性设置为 false,但仍然没有被调用。android:focusable
OnTouch
片段位置.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);
}
}
}
解决方案
推荐阅读
- javascript - 异步回调返回数组代替对象
- delphi - 在 GrayScale 中绘制来自 TPngImageList 的位图图像
- google-sheets - 用于在最接近零的单元格区域中查找值的公式,其中这些单元格包含字母
- origen-sdk - Origen 编译器可以在串联模式下运行吗?
- javascript - Angular 2中具有动态字段的NgModel
- visual-studio - 您可以向(TFS)源代码管理资源管理器添加过滤器(基于标签)吗?
- python - Pandas install-导入多数组numpy扩展
- github-api - 从 Github 企业 API 获取日期范围内的问题
- javascript - 在 span 元素中转换 textNode 的子字符串
- java - 将 cURL 转换为 Java 以进行 SOAP 调用