Android simple to use DrawerLayout do list in the left sliding menu -Kotlin
plan
related information
Android DataBinding used in custom Adapter in RecyclerView
Code
Creating item layout
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="name"
type="String" />
</data>
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginTop="1dp"
android:background="@android:color/white">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ctl_item"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/img_icon"
android:layout_width="40dp"
android:layout_height="match_parent"
android:layout_marginStart="20dp"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:src="@mipmap/icon_test"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/txt_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:ellipsize="end"
android:singleLine="true"
android:text='@{name}'
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/img_icon"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity='end'
android:orientation="horizontal">
<Button
android:id="@+id/txt_modify"
style="@style/Base.Widget.AppCompat.Button.Borderless"
android:layout_width="70dp"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_bright"
android:gravity="center"
android:text="编辑"
android:textColor="@android:color/white"
android:textSize="14sp" />
<Button
android:id="@+id/txt_delete"
style="@style/Base.Widget.AppCompat.Button.Borderless"
android:layout_width="70dp"
android:layout_height="match_parent"
android:background="@android:color/holo_red_light"
android:gravity="center"
android:text="删除"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>
</androidx.drawerlayout.widget.DrawerLayout>
</layout>
Creating Adapter
package com.dlong.drawerlayouttest
import android.app.Activity
import android.content.Context
import android.graphics.Point
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.customview.widget.ViewDragHelper
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.RecyclerView
import com.dlong.drawerlayouttest.databinding.ItemTestBinding
/**
* @author D10NG
* @date on 2020-02-19 10:51
*/
class TestAdapter constructor(
val context: Context,
var mList: List<String> = listOf()
) : RecyclerView.Adapter<TestAdapter.ViewHolder>() {
fun update(list: List<String>) {
this.mList = list
notifyDataSetChanged()
}
inner class ViewHolder constructor(
val binding: ItemTestBinding
) : RecyclerView.ViewHolder(binding.root) {
fun bind(name: String) {
/** 修改侧滑触发距离 */
val rightDraggerField = binding.drawer::class.java.getDeclaredField("mRightDragger")
rightDraggerField.isAccessible = true
val rightDragger = rightDraggerField.get(binding.drawer) as ViewDragHelper
val edgeSizeField = rightDragger::class.java.getDeclaredField("mEdgeSize")
edgeSizeField.isAccessible = true
val edgeSize = edgeSizeField.getInt(rightDragger)
val displaySize = Point()
(context as Activity).windowManager.defaultDisplay.getSize(displaySize)
// 屏幕右侧的50%位置都可触发滑动
edgeSizeField.setInt(rightDragger, edgeSize.coerceAtLeast((displaySize.x * 0.5).toInt()))
binding.name = name
binding.executePendingBindings()
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding: ItemTestBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.context),
R.layout.item_test, parent, false)
return ViewHolder(binding)
}
override fun getItemCount(): Int = this.mList.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(this.mList[position])
}
}
Focus on this, or at the edge of the screen need to pull it out
/** 修改侧滑触发距离 */
val rightDraggerField = binding.drawer::class.java.getDeclaredField("mRightDragger")
rightDraggerField.isAccessible = true
val rightDragger = rightDraggerField.get(binding.drawer) as ViewDragHelper
val edgeSizeField = rightDragger::class.java.getDeclaredField("mEdgeSize")
edgeSizeField.isAccessible = true
val edgeSize = edgeSizeField.getInt(rightDragger)
val displaySize = Point()
(context as Activity).windowManager.defaultDisplay.getSize(displaySize)
// 屏幕右侧的50%位置都可触发滑动
edgeSizeField.setInt(rightDragger, edgeSize.coerceAtLeast((displaySize.x * 0.5).toInt()))
Page Layout
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rcv"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Page logic
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var adapter: TestAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
adapter = TestAdapter(this)
// 初始化
binding.rcv.layoutManager = LinearLayoutManager(this)
binding.rcv.adapter = adapter
// 填入数据
val nameList = mutableListOf<String>()
for(i in 0 until 50) {
nameList.add("全球通缉令 $i 号")
}
adapter.update(nameList)
}
}