如何在另一个回收站视图中滚动回收站视图 onItemClick?

时间:2021-07-23 12:33:54

标签: android-studio kotlin android-recyclerview

我正在构建一个小型词典应用程序,截图如下:

Screenshot

当我点击 mRecyclerView1 中的一个字母时,我想将 mRecyclerView2 滚动到以该特定字母开头的第一个单词。

mRecyclerView1 adapter 中,我创建了一个 interface 来获取点击字母的值。 然后在片段中,我在 scrollToPositionWithOffset 方法中找到了 onLetterClick 的解决方法,如下所示:

override fun onLetterClick(letter: String) {
    when (letter) {
        "А" -> {
            (mRecyclerView2!!.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(
                0,
                0
            )
        }
        "Б" -> {
            (mRecyclerView2!!.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(
                140,
                0
            )
        }
    }

问题是我必须将字母表中的所有字母以及以它们开头的第一个单词的位置相加。如果我以后决定添加更多词,这些位置将发生变化。

有没有更聪明的方法来实现这种滚动效果?如果没有,是否可以使用 for/while 循环而不是对所有字母使用 when

任何帮助将不胜感激!谢谢^^

2 个答案:

答案 0 :(得分:0)

您可以使用这样的集合Map<String, Int>,其中String是字母,Int是位置,然后将位置值按字母传递给onLetterClick(position: Int)并调用{{1} }. 恕我直言,最好根据您的情况使用准备好的字典。

答案 1 :(得分:0)

一种方法是维护一个 Map<String,Int>Map<Char, Int>(您的选择),其中包含以给定字符开头的第一个单词的索引。例如 ("A" -> 0 , "B" -> 5 )

在您的情况下,您可以在 RecyclerView 中加载数据时准备地图,如下所示

val list = // This is list of words
val map = mutableMapOf<String, Int>()
list.forEachIndexed { index, s ->
     map.putIfAbsent(s[0].toString(), index)   // Handle lowercase/uppercase if required
 }

现在将此 map 传递给您的 adapter,当点击任何项目时,您可以从 map 获取项目的位置

map[word[0].toString()]