国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android自定義側(cè)滑Item

這篇具有很好參考價值的文章主要介紹了Android自定義側(cè)滑Item。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Android自定義側(cè)滑Item,Android,android,giteeAndroid自定義側(cè)滑Item,Android,android,gitee

源碼地址:https://github.com/LanSeLianMa/CustomizeView/tree/master/cehuaitem

使用方式一:XML布局中直接使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <com.test.festec.cehuaitem.widget.SideslipContainer
        android:id="@+id/sideslip_container01"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        app:option_width="65dp">

        <com.test.festec.cehuaitem.widget.SideslipContent
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:background="@color/d5"
                android:paddingTop="20dp"
                android:textAlignment="center"
                android:textSize="20sp"
                android:text="content"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

        </com.test.festec.cehuaitem.widget.SideslipContent>

        <com.test.festec.cehuaitem.widget.SideslipOption
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/blue"
            android:tag="add"
            android:text="增加" />

        <com.test.festec.cehuaitem.widget.SideslipOption
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/orange"
            android:tag="edit"
            android:text="編輯" />

        <com.test.festec.cehuaitem.widget.SideslipOption
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/red"
            android:tag="delete"
            android:text="刪除" />

    </com.test.festec.cehuaitem.widget.SideslipContainer>


</LinearLayout>

Activity中監(jiān)聽

class MainActivity : Activity() {

    private lateinit var binding: ActivityMainBinding

    private var options = mutableListOf("增加", "編輯", "刪除")
    private var optionBg = mutableListOf(R.color.blue, R.color.orange, R.color.red)

    @SuppressLint("UseCompatLoadingForDrawables")
    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.sideslipContainer01.addOnClickListener(object : SideslipContainer.SideslipContainerOnClick {

            override fun optionOnClick(optionTag: Any) {
                Toast.makeText(this@MainActivity,"optionTag:$optionTag", Toast.LENGTH_SHORT).show()
                binding.sideslipContainer01.sideslipRecover()
            }

            override fun contentOnClick() {
                Toast.makeText(this@MainActivity,"content", Toast.LENGTH_SHORT).show()
                binding.sideslipContainer01.sideslipRecover()
            }

        })

    }

}

使用方式二:代碼方式使用

先定義一個容器文章來源地址http://www.zghlxwxcb.cn/news/detail-645236.html

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <LinearLayout
        android:id="@+id/container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" />


</LinearLayout>

Activity中動態(tài)添加

class MainActivity : Activity() {

    private lateinit var binding: ActivityMainBinding

    private var options = mutableListOf("增加", "編輯", "刪除")
    private var optionBg = mutableListOf(R.color.blue, R.color.orange, R.color.red)

    @SuppressLint("UseCompatLoadingForDrawables")
    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 創(chuàng)建側(cè)滑容器,配置基礎(chǔ)參數(shù)
        val sideslip = SideslipContainer(this, DensityUtil.dp2px(this, 65f))
        val layoutParams = LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            DensityUtil.dp2px(this, 70f)
        )
        sideslip.layoutParams = layoutParams

        // 創(chuàng)建側(cè)滑內(nèi)容
        val content = SideslipContent(this).apply {
            background = resources.getDrawable(R.color.black,null)
        }

        // 加入側(cè)滑容器中
        sideslip.addView(content)

        // 創(chuàng)建選項卡,并加入側(cè)滑容器中
        options.forEachIndexed { index, str ->
            val option = SideslipOption(this,str)
            option.text = str
            option.background = resources.getDrawable(optionBg[index], null)
            sideslip.addView(option)
        }

        // 點擊監(jiān)聽
        sideslip.addOnClickListener(object : SideslipContainer.SideslipContainerListener {
            override fun optionOnClick(optionTag: Any) {
                Log.e("TAG","optionTag:$optionTag")
            }

            override fun contentOnClick() {
                Log.e("TAG","content")
            }
        })

        binding.container.addView(sideslip)

    }

}

使用方式三:結(jié)合RecyclerView使用

重寫LayoutManager

// 重寫LayoutManager,動態(tài)讓RecyclerView 禁止/恢復 Y軸滾動
open class CustomLinerLayoutManager(context: Context) : LinearLayoutManager(context) {

    private var isScrollEnabled = true

    fun getEnabled(): Boolean {
        return isScrollEnabled
    }

    fun setScrollEnabled(flag: Boolean) {
        isScrollEnabled = flag
    }

    override fun canScrollVertically(): Boolean {
        return isScrollEnabled && super.canScrollVertically();
    }

}

重寫RecyclerView

class MyRecyclerView : RecyclerView {

    constructor(context: Context) : super(context)
    constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)

    init {
        addOnScrollListener(object : RecyclerView.OnScrollListener() {

            /**
             *
             * public static final int SCROLL_STATE_IDLE = 0;  :  RecyclerView 當前未滾動。
             *
             * public static final int SCROLL_STATE_DRAGGING = 1;  :  RecyclerView 當前正在被外部輸入(例如用戶觸摸輸入)拖動。
             *
             * public static final int SCROLL_STATE_SETTLING = 2;  :  RecyclerView 當前正在動畫到最終位置,而不是在外部控制。
             */
            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
                    childrenRecover()
                }
            }
        })
    }

    // view初始化
    private var viewInit = false

    // 上一會觸摸的子View
    var originalChild: SideslipContainer? = null

    // 當前觸摸的子View
    var currentChild: SideslipContainer? = null

    private var customLayoutManager: CustomLinerLayoutManager? = null

    private var childMoveCallback = object : ChildOnTouchCallback {
        override fun currentChildMove() {
            childrenRecover()
        }

        override fun originalChild(originalSideslip: SideslipContainer?) {
            originalChild = originalSideslip
        }

        override fun currentChild(currentContainer: SideslipContainer?) {
            currentChild = currentContainer
        }

        override fun listStopYScroll() {
            // Log.e("TAG", "List停止?jié)L動")
            if (customLayoutManager!!.getEnabled()) {
                customLayoutManager?.setScrollEnabled(false)
            }
        }

        override fun listRecoverYScroll() {
            // Log.e("TAG", "List恢復滾動")
            if (!(customLayoutManager!!.getEnabled())) {
                customLayoutManager?.setScrollEnabled(true)
            }
        }

    }

    // 子View恢復
    private fun childrenRecover() {
        children.forEach {
            (it as SideslipContainer).sideslipRecover()
        }
    }

    override fun onViewAdded(child: View?) {
        // Log.e("TAG","onViewAdded")
        val sideslipContainer = (child as SideslipContainer)
        sideslipContainer.addOnChildMoveCallback(childMoveCallback)
    }

    // 當復用item,徹底超出屏幕,不可見時執(zhí)行
    override fun onViewRemoved(child: View?) {
        // Log.e("TAG","onViewRemoved")
        (child as SideslipContainer).sideslipStateRest()
    }

    override fun onWindowFocusChanged(hasWindowFocus: Boolean) {
        // Log.e("TAG","onWindowFocusChanged")
        super.onWindowFocusChanged(hasWindowFocus)
        if (!viewInit) {
            customLayoutManager = (layoutManager as CustomLinerLayoutManager)
        }
        viewInit = true
    }

    interface ChildOnTouchCallback {

        // 有子View側(cè)滑了
        fun currentChildMove()

        // 上一個觸摸的子View
        fun originalChild(originalSideslip: SideslipContainer?)

        // 當前觸摸的子View
        fun currentChild(currentContainer: SideslipContainer?)

        // 列表停止Y軸滾動
        fun listStopYScroll()

        // 列表恢復Y軸滾動
        fun listRecoverYScroll()

    }

}

RecyclerView適配器

class MyListAdapter(
    var context: Context,
    var data: MutableList<Info>
) : RecyclerView.Adapter<MyListAdapter.MyViewHolder>() {

    private var options = mutableListOf("增加", "編輯", "刪除")
    private var optionBg =
        mutableListOf(R.color.blue, R.color.orange, R.color.red)

    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val itemView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false)
        val sideslip = sideslipContainer(itemView)
        return MyViewHolder(sideslip)
    }

    @SuppressLint("UseCompatLoadingForDrawables", "ResourceAsColor")
    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val sideslip = holder.itemView as SideslipContainer

        // 根據(jù)不同權(quán)限,添加不同的選項卡
        val optionsView = mutableListOf<SideslipOption>()
        if (data[position].level == 0) {
            optionsView.clear()
        } else if (data[position].level == 1) {
            val option = SideslipOption(context, options[1])
            option.text = options[1]
            option.background = context.resources.getDrawable(optionBg[1], null)
            optionsView.add(option)
        } else {
            options.forEachIndexed { index, str ->
                val option = SideslipOption(context, str)
                option.text = str
                option.background = context.resources.getDrawable(optionBg[index], null)
                optionsView.add(option)
            }
        }
        sideslip.addMultipleOption(optionsView)

        // 點擊回調(diào)
        sideslip.addOnClickListener(object : SideslipContainer.SideslipContainerOnClick {
            override fun optionOnClick(optionTag: Any) {
                Toast.makeText(context,"${holder.adapterPosition} -- optionTag:$optionTag",Toast.LENGTH_SHORT).show()
                sideslip.sideslipRecover()
            }

            override fun contentOnClick() {
                Toast.makeText(context,"${holder.adapterPosition} - content",Toast.LENGTH_SHORT).show()
                sideslip.sideslipRecover()
            }
        })
        holder.idTv.text = data[position].id.toString()
        holder.titleTv.text = data[position].title
        holder.describeTv.text = data[position].describe
    }

    override fun getItemCount(): Int {
        return data.size
    }

    @SuppressLint("UseCompatLoadingForDrawables")
    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    private fun sideslipContainer(itemView: View): SideslipContainer {
        // 創(chuàng)建側(cè)滑容器,配置基礎(chǔ)參數(shù)
        val sideslip = SideslipContainer(context)
        sideslip.setOptionWidth(DensityUtil.dp2px(context, 65f))

        val layoutParams = LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            DensityUtil.dp2px(context, 70f)
        )
        sideslip.layoutParams = layoutParams

        // 創(chuàng)建側(cè)滑內(nèi)容
        val content = SideslipContent(context)
        content.addView(itemView)

        // 加入側(cè)滑容器中
        sideslip.addView(content)

        // 創(chuàng)建選項卡,并加入側(cè)滑容器中
        // options.forEachIndexed { index, str ->
        //    val option = SideslipOption(context, str)
        //    option.text = str
        //    option.background = context.resources.getDrawable(optionBg[index], null)
        //    sideslip.addView(option)
        // }
        return sideslip
    }

    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var idTv: TextView
        var titleTv: TextView
        var describeTv: TextView

        init {
            idTv = itemView.findViewById(R.id.id_tv)
            titleTv = itemView.findViewById(R.id.title_tv)
            describeTv = itemView.findViewById(R.id.describe_tv)
        }
    }
}

Activity中綁定數(shù)據(jù)

class ListActivity : Activity() {

    private lateinit var binding: ListLayoutBinding

    private val data: MutableList<Info> = mutableListOf(
        Info(0, "title", "content", 2),
        Info(1, "title", "content", 1),
        Info(2, "title", "content", 2),
        Info(3, "title", "content", 2),
        Info(4, "title", "content", 2),
        Info(5, "title", "content", 1),
        Info(6, "title", "content", 1),
        Info(7, "title", "content", 2),
        Info(8, "title", "content", 2),
        Info(9, "title", "content", 1),
        Info(10, "title", "content", 1),
        Info(11, "title", "content", 2),
        Info(12, "title", "content", 2),
        Info(13, "title", "content", 1),
        Info(14, "title", "content", 1),
        Info(15, "title", "content", 2),
        Info(16, "title", "content", 2),
        Info(17, "title", "content", 2),
        Info(18, "title", "content", 2),
        Info(19, "title", "content", 1),
        Info(20, "title", "content", 2),
        Info(21, "title", "content", 1),
        Info(22, "title", "content", 2),
        Info(23, "title", "content", 2),
        Info(24, "title", "content", 2),
        Info(25, "title", "content", 1),
        Info(26, "title", "content", 2),
        Info(27, "title", "content", 1),
        Info(28, "title", "content", 2),
        Info(29, "title", "content", 2),
        Info(30, "title", "content", 2),
        Info(31, "title", "content", 1),
        Info(32, "title", "content", 1),
        Info(33, "title", "content", 2),
        Info(34, "title", "content", 2),
        Info(35, "title", "content", 1),
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ListLayoutBinding.inflate(layoutInflater)
        setContentView(binding.root)
        val adapter = MyListAdapter(this, data)
        val linearLayoutManager = CustomLinerLayoutManager(this)
        binding.root.layoutManager = linearLayoutManager
        binding.root.adapter = adapter
    }

}

到了這里,關(guān)于Android自定義側(cè)滑Item的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • Android:RecyclerView自由拖動item

    原生就自帶有可拖動item的工具:ItemTouchHelper 看下效果: 可拖動RecyclerView預覽效果 接下來我們看如何使用。 其中判斷條件中的item.isMovable這邊是記錄該item是否可以拖動,也可以換成其他判斷條件比如根據(jù)位置判斷等。 另外,需要留意一點,如果你是在onBindViewHolder中有設(shè)置點

    2024年01月23日
    瀏覽(22)
  • Android Recyclerview的item間距實現(xiàn)

    Android Recyclerview的item間距實現(xiàn)

    Recyclerview中,提供了一個方法 addItemDecoration 給我們用于設(shè)置item的分割線 下面提供幾個常見的分割線效果 注: 下面的 SizeUtils 是AndroidUtilCode此庫里的工具類,需要添加依賴,也可以自行修改封裝的方法(主要是將dp單位轉(zhuǎn)為px) 以下代碼已封裝在我的庫中stars-one/XAndroidUtil: 封裝自己常

    2024年02月05日
    瀏覽(19)
  • Android LinearLayout快速設(shè)置每個item間隔

    原文地址: Android LinearLayout快速設(shè)置每個item間隔 平常使用LinearLayout的時候,有時候會需要對每個item設(shè)置間距,但是每個item都加上margin的方法實在有些繁瑣 因為之前是在寫JavaFx程序,里面的Vbox或Hbox都會提供一個Space的參數(shù),可以用來快速設(shè)置每個item之間的間距 而Android這邊,是沒看

    2024年02月17日
    瀏覽(26)
  • 【Android】RecycleView 將指定item滾動置頂(kotlin)

    item有三種情況: 情況1:在可見范圍之前 item在第一個可見item之前,直接用smoothScrollToPosition,則當該item移動到可見范圍時,它就在RecyclerView頂部 情況2:在可見范圍內(nèi) tem在可見范圍內(nèi)(即在第一個可見item之后,最后一個可見item之前),這時scrollToPosition失效,需要手動計算

    2024年02月04日
    瀏覽(15)
  • Android開發(fā):RecyclerView獲取item位置的幾種方法比較

    ????????當使用 RecyclerView 來展示列表數(shù)據(jù)時,獲取 item 的位置是一個常見的需求。RecyclerView 提供了多種獲取 item 位置的方法,包括 getAdapterPosition() 、 getBindingAdapterPosition() 、 getAbsoluteAdapterPosition() 等等。這些方法的實現(xiàn)原理和返回值有所不同,因此在實際使用時需要根據(jù)

    2023年04月20日
    瀏覽(100)
  • Android NestedScrollView包裹RecyclerView高度撐滿所有item,kotlin

    Android NestedScrollView包裹RecyclerView高度撐滿所有item,kotlin 當用NestedScrollView包裹RecyclerView后, ? 然而設(shè)置: 會使得RecyclerView加載完成所有itemCount的數(shù)理,撐滿整個RecyclerView高度,這深深改變了RecyclerView只加載顯示當前屏幕可見區(qū)域的特性,此時RecyclerView一次性加載全部item。

    2024年02月16日
    瀏覽(29)
  • android,Compose,消息列表和動畫(點擊item的時候,就會刪除)

    android,Compose,消息列表和動畫(點擊item的時候,就會刪除)

    Compose,消息列表和動畫(點擊item的時候,就會刪除) 案例二:

    2024年02月13日
    瀏覽(27)
  • Android中實現(xiàn)RecyclerView,并對item及其多個子控件的點擊事件監(jiān)聽

    Android中實現(xiàn)RecyclerView,并對item及其多個子控件的點擊事件監(jiān)聽

    目錄 背景 實現(xiàn)RecyclerView 第一步、 新建item的xml 第二步、在activity的布局中引入?RecyclerView 第三步、新建一個adapter? ?第四步、在activity中初始化綁定adapter即可 實現(xiàn)item及其多個子組件點擊事件監(jiān)聽 第一步、 適配器中創(chuàng)建監(jiān)聽對象 第二步、適配器中綁定監(jiān)聽item和子組件 第三

    2024年02月19日
    瀏覽(24)
  • Android RecyclerView實現(xiàn)選中Item變色的最精簡高效實現(xiàn)(絕不會出現(xiàn)點擊時其它item偶爾也被選中現(xiàn)象)

    Android RecyclerView實現(xiàn)選中Item變色的最精簡高效實現(xiàn)(絕不會出現(xiàn)點擊時其它item偶爾也被選中現(xiàn)象)

    效果: ?核心代碼如下: 代碼超精簡,試一下您就知道了。跟網(wǎng)上其它的教程不同,絕不會出現(xiàn)點擊時其它item偶爾也被同步選中改變顏色導致亂串的現(xiàn)象

    2024年02月11日
    瀏覽(18)
  • 【Android】RecyclerView實現(xiàn)列表中的Item之間設(shè)置間距的一種方式

    RecyclerView 的 Item 默認沒有間距是因為 RecyclerView 是一個高度自定義的控件,它的目標是提供一個高效靈活的列表展示,并且適應各種不同的布局需求。 為了讓開發(fā)者能夠充分自定義列表項的布局和樣式,RecyclerView 沒有默認設(shè)置項來添加 item 之間的間距。這樣設(shè)計的好處是,

    2024年02月13日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包