#android
Вопрос:
В моем приложении для Android есть панель навигации. Я хочу заполнить меню навигационного ящика пользовательскими записями. Определяемая пользователем запись моделируется классом:
data class Location(val name: String, val data: Int)
При нажатии на элемент меню я хочу вызвать метод, принимающий Location
соответствующий элемент меню, на который был нажат. Лучшая идея, которая у меня была, — сохранить модель как List<Location>
(этот список в конечном итоге будет загружен из базы данных) и заполнить меню в onCreate
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
private val toolbar by lazy { findViewById<Toolbar>(R.id.toolbar) }
private val drawerLayout by lazy { findViewById<DrawerLayout>(R.id.drawerLayout) }
private val navigationView by lazy { findViewById<NavigationView>(R.id.navigation) }
private val savedLocations = listOf(Location("foo", 42), Location("bar", 1337))
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Connect the action bar and the navigation drawer
setSupportActionBar(toolbar)
val toggle = ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawerOpen, R.string.drawerClose)
drawerLayout.addDrawerListener(toggle)
toggle.syncState()
// Handle clicks in the navigation drawer
navigationView.setNavigationItemSelectedListener(this)
// Populate the navigation drawer
populateDrawer()
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
// ...
return true
}
fun loadLocation(location: Location) {
// application logic here
}
private fun populateDrawer() {
for (location in savedLocations) {
navigationView.menu.add(location.name)
}
}
}
В onNavigationItemSelected
я хотел бы сделать что-то вроде
override fun onNavigationItemSelected(item: MenuItem): Boolean {
val i = item.getIndex();
loadLocation(savedLocations[i])
return true
}
Однако, похоже, что MenuItem
он не знает своего индекса. Что я мог бы сделать, так это вручную указать itemId
следующее:
savedLocations.forEachIndexed { index, location ->
// set itemId = index for every MenuItem
navigationView.menu.add(0, index, 0, location.name)
}
где i
находится индекс итерации.
Но это становится банальным, потому MenuItem.NONE == 0
что .
Есть ли какое-либо лучшее решение или соглашение Android должно использовать здесь другой шаблон?
Ответ №1:
Решением для меня было использовать a RecyclerView
или ListView
вместо a NavigationView
.