Android kotlin

Bonjour,

je commence avec android studio sur le language kotlin et il y'a un bout de code que je ne comprend pas si qulqu'un pourrait m'expliquer cela en detail il sert a recuperer la position d'un post qui marche avec un adapter merci.


Windows / Chrome 105.0.0.0

2 réponses

  1. Modérateur

    Hello,

    Le mot-clé as te permet d'effectuer un smart cast. En Java, on aurait écrit ceci

    AdapterView.ContextMenuInfo info = (AdapterView.ContextMenuInfo) item.menuInfo

    1. Super merci mais comment fait t’il pour récupérer la position 

    2. Modérateur
      @Baptiste

      La position est un champ de l'objet ContextMenuInfo. Le code ne montre pas comment est créé ce menu, il faut regarder du côté de l'Adapter

    3. Modérateur
      @Baptiste

      Si tu veux, mais quel ton objectif exactement ?

  2. j'aimerai comprendre comment je rcupere la position d'un element avec ca

    homeActivity.kt :

    package com.example.firstapp
    
    import android.annotation.SuppressLint
    import android.content.Intent
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.view.ContextMenu
    import android.view.Menu
    import android.view.MenuItem
    import android.view.View
    import android.widget.*
    
    class HomeActivity : AppCompatActivity() {
        var postsArray = ArrayList<Post>()
        lateinit var listPosts: ListView
        lateinit var adapter : PostsAdapter
    
            override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_home)
            val email = intent.getStringExtra("email")
    //venir chercher le id du container listView dans activity_home
            listPosts = findViewById(R.id.listPost)
            postsArray = arrayListOf(
                Post("post 1","une description qui va etre afficher ici au lieu de ce texte qui ne veut rien dire",R.drawable.ic_launcher),
                Post("post 2","une description qui va etre afficher ici au lieu de ce texte qui ne veut rien dire",R.drawable.ic_launcher),
                Post("post 3","une description qui va etre afficher ici au lieu de ce texte qui ne veut rien dire",R.drawable.ic_launcher),
                Post("post 4","une description qui va etre afficher ici au lieu de ce texte qui ne veut rien dire",R.drawable.ic_launcher),
                Post("post 5","une description qui va etre afficher ici au lieu de ce texte qui ne veut rien dire",R.drawable.ic_launcher)
            )
    
            adapter = PostsAdapter(this, R.layout.item_post,postsArray)
            listPosts.adapter = adapter
    
            listPosts.setOnItemClickListener { adapterView, view, position, id ->
                val clickedPost = postsArray[position]
                val intentToDetailActivity = Intent(this,PostDetailsActivity::class.java)
                intentToDetailActivity.putExtra("post",clickedPost.titre)
                startActivity(intentToDetailActivity)
            }
    // si on reste appuyer sur une un itemPost
            registerForContextMenu(listPosts)
        }
    //menu en haut a droite
        override fun onCreateOptionsMenu(menu: Menu): Boolean {
            menuInflater.inflate(R.menu.home_menu,menu)
            return super.onCreateOptionsMenu(menu)
        }
    //item en haut a droite
        override fun onOptionsItemSelected(item: MenuItem): Boolean {
            if(item.itemId == R.id.itemAdd){
                Toast.makeText(this, "add new item", Toast.LENGTH_SHORT).show()
            }else if (item.itemId == R.id.itemConfig){
                Toast.makeText(this, "settings", Toast.LENGTH_SHORT).show()
            }else if (item.itemId == R.id.itemLogout){
                finish()
    
            }
            return super.onOptionsItemSelected(item)
        }
        //creer un menu quelqu'on que
        override fun onCreateContextMenu(
            menu: ContextMenu?,
            v: View?,
            menuInfo: ContextMenu.ContextMenuInfo?
        ) {
    
            menuInflater.inflate(R.menu.list_context_menu,menu)
            super.onCreateContextMenu(menu, v, menuInfo)
        }
    
    
    //item qui apparait quand on reste appuyer
        override fun onContextItemSelected(item: MenuItem): Boolean {
        val info : AdapterView.AdapterContextMenuInfo = item.menuInfo as AdapterView.AdapterContextMenuInfo
        val position : Int = info.position
            if(item.itemId == R.id.itemShow) {
                Intent(this,PostDetailsActivity::class.java).also {
                    it.putExtra("titre",postsArray[position].titre)
                    startActivity(it)
    
    
                }
            }else if(item.itemId == R.id.itemDelete){
                postsArray.removeAt(position)
                adapter.notifyDataSetChanged()
            }
            return super.onContextItemSelected(item)
        }
    PostsAdapter.kt
    package com.example.firstapp
    
    import android.annotation.SuppressLint
    import android.content.Context
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import android.widget.ArrayAdapter
    import android.widget.ImageView
    import android.widget.TextView
    
    class PostsAdapter(/*ou on veut afficher le xml*/ var mContext: Context,/* le xml qu'on veut afficher*/  var resource : Int,/* la liste info qu'on va afficher*/  var values :ArrayList<Post>):
        ArrayAdapter<Post>(mContext,resource,values){
    
        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
    //position d'un element ex: titre ,description,image voir post
            val post = values[position]
            val itemView = LayoutInflater.from(mContext).inflate(resource,parent,false)
            val tvTitre = itemView.findViewById<TextView>(R.id.tvTitre)
            val tvDescription = itemView.findViewById<TextView>(R.id.tvDescription)
            val imagePost = itemView.findViewById<ImageView>(R.id.imagePost)
            tvTitre.text = post.titre
            tvDescription.text = post.description
            imagePost.setImageResource(post.image)
            return itemView
        }
    }
    1. Modérateur

      C'est dans AdapterView.AdapterContextMenuInfo qu'est fait le traitement. Mais, très certainement, c'est juste la position dans le tableau

    2. @BunoCS

      j'ai pas compris a quoi sert le smart cast