📌  相关文章
📜  如何在 Android 的 ListView 中检测向上和向下滚动手势?

📅  最后修改于: 2022-05-13 01:54:21.296000             🧑  作者: Mango

如何在 Android 的 ListView 中检测向上和向下滚动手势?

Android 中的 ListView 是用于显示项目的可滚动列表。数据是从源获取或在应用程序中硬编码的项目列表或数组,可以使用 ListView 逐行显示。如果项目较少,则列表甚至可能不会到达屏幕底部。但是,如果项目的数量很大,那么它们可能会超出屏幕底部,滚动函数会进入屏幕底部并让用户上下滚动以发现被覆盖的项目。

在本文中,我们将向您展示如何检测 ListView 中的上下滚动。 IDE 准备就绪后,请按照以下步骤操作。

分步实施

第 1 步:在 Android Studio 中创建一个新项目

要在 Android Studio 中创建新项目,请参阅如何在 Android Studio 中创建/启动新项目。我们在Kotlin中演示了该应用程序,因此请确保在创建新项目时选择 Kotlin 作为主要语言。

第 2 步:使用 activity_main.xml 文件

导航到app > res > layout > activity_main.xml并将以下代码添加到该文件。下面是activity_main.xml文件的代码。我们实现了一个显示滚动状态的 TextView 和一个显示项目的 ListView。

XML


  
    
  
    
  


Kotlin
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.*
  
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        val mList = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
            "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
            "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",)
  
        val mListView = findViewById(R.id.list_view)
        val mTextView = findViewById(R.id.text_view)
        val mAdapter = ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item, mList)
  
        mListView.adapter = mAdapter
  
        mListView.setOnScrollListener(object : AbsListView.OnScrollListener{
            override fun onScrollStateChanged(view: AbsListView?, scrollState: Int) {
                // Do nothing
            }
  
            private var lastFirstVisibleItem = 0
  
            override fun onScroll(view: AbsListView?, firstVisibleItem: Int, visibleItemCount: Int, totalItemCount: Int) {
                if (lastFirstVisibleItem < firstVisibleItem) {
                    // Down
                    mTextView.text = "Scrolling down"
                }
                if (lastFirstVisibleItem > firstVisibleItem) {
                    // Up
                    mTextView.text = "Scrolling Up"
                }
                lastFirstVisibleItem = firstVisibleItem
            }
        })
  
    }
}


第 3 步:使用 MainActivity.kt 文件

在主代码中,我们声明了一个元素数组列表(数字从 1 到 30)。使用适配器,此数组将显示在 ListView 中。在 ListView 上调用滚动侦听器以获取有关第一个可见项、可见项总数和项总数的信息。缓冲区索引变量最初设置为 0。现在,根据我们的算法,如果第一个可见元素索引大于缓冲区变量,那么我们基本上是向下滚动。否则我们正在向上滚动。现在参考下面的代码。

科特林

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.*
  
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        val mList = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
            "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
            "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",)
  
        val mListView = findViewById(R.id.list_view)
        val mTextView = findViewById(R.id.text_view)
        val mAdapter = ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item, mList)
  
        mListView.adapter = mAdapter
  
        mListView.setOnScrollListener(object : AbsListView.OnScrollListener{
            override fun onScrollStateChanged(view: AbsListView?, scrollState: Int) {
                // Do nothing
            }
  
            private var lastFirstVisibleItem = 0
  
            override fun onScroll(view: AbsListView?, firstVisibleItem: Int, visibleItemCount: Int, totalItemCount: Int) {
                if (lastFirstVisibleItem < firstVisibleItem) {
                    // Down
                    mTextView.text = "Scrolling down"
                }
                if (lastFirstVisibleItem > firstVisibleItem) {
                    // Up
                    mTextView.text = "Scrolling Up"
                }
                lastFirstVisibleItem = firstVisibleItem
            }
        })
  
    }
}

输出:

我们可以看到,当我们向下滚动时,TextView 显示“向下滚动”。当我们向上滚动时,它会显示“向上滚动”。