Как смоделировать меню навигационного ящика в списке объектов?

#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 .