Позвольте мне показать вам код, который я написал перед вопросом.
item_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView 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_margin="8dp"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true">
<RelativeLayout
android:id="@+id/view_background"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/delete"
android:layout_width="wrap_content"
android:layout_height="70dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:text="DELETE" />
<Button
android:id="@+id/edit"
android:layout_width="wrap_content"
android:layout_height="70dp"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:text="EDIT" />
</RelativeLayout>
<LinearLayout
android:id="@+id/view_foreground"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:orientation="horizontal">
<ImageView
android:id="@+id/image"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:scaleType="centerCrop"
tools:src="@drawable/ic_background" />
</androidx.cardview.widget.CardView>
Макет элемента, который будет помещен в RecyclerView. Как видите, фон и передний план представления существуют.
RecyclerViewAdapter.kt
class RecyclerViewAdapter(var array: ArrayList<Data>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.item_layout, parent, false)
return SpringEffectViewHolder(view)
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as SpringEffectViewHolder
Glide.with(context).load(array[position].image).placeholder(R.drawable.bg_item).into(holder.image)
}
}
В MainActivity с RecyclerView я применил ItemTouchHelper к RecyclerView.
MainActivity.ky
class SwipeDeleteActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
val callbackSpringDelete = CallbackSpringDelete()
val itemTouchHelper = ItemTouchHelper(callbackSpringDelete)
itemTouchHelper.attachToRecyclerView(recyclerView)
}
}
Мне удалось показать кнопки R.id.delete
и R.id.edit
в view_background
, проведя элемент внутри recyclerView, но я не знаю, где создать нажатие кнопки, т.е. setOnClickListener. Я попытался реализовать onBindViewHolder внутри адаптера, но он работал очень странно (перед тем, как провести элемент, поэтому мне пришлось щелкнуть и ответить, прежде чем кнопки DELETE и EDIT стали видны.).
CallbackSpringDelete.kt
class CallbackSpringDelete() : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) {
var dx = dX
val foregroundView = (viewHolder as RecyclerViewAdapter.MyViewHolder).viewForeground
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX / 4, dY, actionState, isCurrentlyActive)
}
}
}
Где мне написать код, который реагирует на нажатие кнопок DELETE и EDIT?