Android simple to use DrawerLayout do list in the left sliding menu -Kotlin

Android simple to use DrawerLayout do list in the left sliding menu -Kotlin

plan

Here Insert Picture Description

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)
    }
}

Get away

Published 102 original articles · won praise 31 · views 50000 +

Guess you like

Origin blog.csdn.net/sinat_38184748/article/details/104389409