我正在构建一个小型词典应用程序,截图如下:
当我点击 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
?
任何帮助将不胜感激!谢谢^^
答案 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()]