简体   繁体   English

将在 RecyclerView 中单击的正确项目 position 返回到另一个活动

[英]Return the correct item position clicked in RecyclerView to another activity

I'm struggling with this problem for weeks and i always get (1) returned from RecyclerView我在这个问题上苦苦挣扎了好几个星期,我总是从 RecyclerView 返回 (1)

  • i want to return the right item position clicked to SceneFormeActivity to be able to chose the correct object, but i'm getting the same "1" everytime so the same Case1'Object informations我想返回正确的项目 position 单击到 SceneFormeActivity 以便能够选择正确的 object,但我每次都得到相同的“1”所以相同的 Case1'Object 信息

my main class.kt code:我的主要 class.kt 代码:

class ListeMeuble3DActivity : AppCompatActivity(),{
    var listMeubles = mutableListOf<Meuble>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_liste_meuble3_d)
         listMeubles = generateList()
        buildRecyclerView()
    }

    private fun generateList(): MutableList<Meuble>{

        val list = ArrayList<Meuble>()

           // to Add an Object Meuble(nom,prix,stock)

            val meuble = Meuble(R.drawable.fauteilgris, "Gris","25000da",1)
            val meuble1 = Meuble(R.drawable.fauteuille1, "","1000d&",1)
            val meuble2 = Meuble(R.drawable.burau, "Bureau","25000da",1)
            list.add(meuble)
            list.add(meuble1)
            list.add(meuble2)

        return list
    }

    fun buildRecyclerView() {
        mon_recycler.setHasFixedSize(true)
        //mon_recycler.setAdapter(mAdapter)
        mon_recycler.layoutManager = LinearLayoutManager(this)

        mon_recycler.adapter = MeubleAdapter(listMeubles.toTypedArray())
        {
            val intent3 = Intent(this, SceneformeActivity::class.java)
            intent3.putExtra("image_url",1)
            startActivity(intent3)
        }
     }
 }

My Adapter Class.kt:我的适配器 Class.kt:

class MeubleAdapter(private val exampleList: Array<Meuble>,val listener: (Meuble)-> Unit) :
    RecyclerView.Adapter<MeubleAdapter.ExampleViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExampleViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.meuble_item,
            parent, false)
        return ExampleViewHolder(itemView)
    }
    override fun onBindViewHolder(holder: ExampleViewHolder, position: Int) {
        val currentItem = exampleList[position]
        holder.imageView.setImageResource(currentItem.imageResource)
        holder.textViewNomMeuble.text = currentItem.nom
        holder.textViewPrix.text = currentItem.prix
        holder.textViewStock.text = currentItem.stock.toString()

        holder.bind(exampleList[position],listener)
    }

    override fun getItemCount() = exampleList.size


    class ExampleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bind(meuble:Meuble,listener: (Meuble) -> Unit)= with(itemView)
        {
            android.util.Log.i("XXXX","FCT Bind ")
            setOnClickListener{(listener(meuble))}
        }

        val imageView: ImageView = itemView.image_view
        val textViewNomMeuble: TextView = itemView.nomMeuble
        val textViewStock: TextView = itemView.stock
        val textViewPrix: TextView = itemView.prix

    }
}

My function in SceneFormeActivity.java where im supposed to get the item position我在 SceneFormeActivity.java 中的 function 我应该得到项目 position

private void initializeGallery() {
        int imageUrl = getIntent().getIntExtra("image_url",0); // here, everytime it return 1
        LinearLayout gallery = findViewById(R.id.gallery_layout);
        int obj =imageUrl;
        switch (obj) {
            case 0: {
                ImageView andy = new ImageView(this);
                andy.setImageResource(R.drawable.fauteilgris);
                andy.setContentDescription("fauteuil Créme");
                andy.setOnClickListener(view ->{addObject(Uri.parse("foteuil.sfb"));});
                gallery.addView(andy);

            }
            break;
            case 1: {
                ImageView andy = new ImageView(this);
                andy.setImageResource(R.drawable.banc);
                andy.setContentDescription("banc extérieur");
                andy.setOnClickListener(view ->{addObject(Uri.parse("Bench.sfb"));});
                gallery.addView(andy);

            }
            break;
            case 2 : {
                ImageView andy = new ImageView(this);
                andy.setImageResource(R.drawable.burau);
                andy.setContentDescription("bureau");
                andy.setOnClickListener(view ->{addObject(Uri.parse("bureau.sfb"));});
                gallery.addView(andy);

            }
            break;
            case 3 : {
                ImageView andy = new ImageView(this);
                andy.setImageResource(R.drawable.fauteuille3);
                andy.setContentDescription("Fauteuil une place");
                andy.setOnClickListener(view ->{addObject(Uri.parse("ff.sfb"));});
                gallery.addView(andy);

            }
            break;
            default:Toast.makeText(getApplicationContext(),"Nothing",Toast.LENGTH_SHORT).show();

                break;

        }
    }

If all you really want is the position of the item then you don't need to send the Meuble on click at all.如果您真正想要的是该项目的 position,那么您根本不需要在点击时发送 Meuble。 In your adapter change onBindViewHolder to:在您的适配器onBindViewHolder更改为:

override fun onBindViewHolder(holder: ExampleViewHolder, position: Int) {
        val currentItem = exampleList[position]
        holder.imageView.setImageResource(currentItem.imageResource)
        holder.textViewNomMeuble.text = currentItem.nom
        holder.textViewPrix.text = currentItem.prix
        holder.textViewStock.text = currentItem.stock.toString()

        holder.bind(position,listener)
    }

Setting your adapter should now look like this:设置您的适配器现在应该如下所示:

 mon_recycler.adapter = MeubleAdapter(listMeubles.toTypedArray()){ position ->
            val intent3 = Intent(this, SceneformeActivity::class.java)
            intent3.putExtra("image_url", position)
            startActivity(intent3)
        }

Edit: Expanding on the adapter usage:编辑:扩展适配器的使用:

Originally, you are passing two things to your Recyclerview Adapter -最初,您将两件事传递给您的 Recyclerview 适配器 -

  1. The list of Meuble (There is no need to convert this to a TypedArray Meuble 列表(无需将其转换为 TypedArray
  2. The lambda that will act on the click of an item in the list lambda 将作用于单击列表中的项目

Consider the refactored code below with my inline comments.考虑下面的重构代码和我的内联注释。 Note - it's not clear to me why you are sending position (assuming just to test?) So instead I'm assuming there is some imageURL in the object that you wish to send.注意 - 我不清楚你为什么要发送 position (假设只是为了测试?)所以我假设 object 中有一些你希望发送的 imageURL。 I show below how you'd access that.我将在下面展示您如何访问它。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_liste_meuble3_d)
    listMeubles = generateList()
    buildRecyclerView()
}

private fun generateList(): MutableList<Meuble>{

    val list = mutableListOf<Meuble>()

       // to Add an Object Meuble(nom,prix,stock)

        val meuble = Meuble(R.drawable.fauteilgris, "Gris","25000da",1)
        val meuble1 = Meuble(R.drawable.fauteuille1, "","1000d&",1)
        val meuble2 = Meuble(R.drawable.burau, "Bureau","25000da",1)
        list.add(meuble)
        list.add(meuble1)
        list.add(meuble2)

    return list
}

fun buildRecyclerView() {
    mon_recycler.setHasFixedSize(true)
    mon_recycler.layoutManager = LinearLayoutManager(this)

    // NOTE: Here the lambda implicitly had an item of type Meuble passed.  We name it here but could have just used "it".
    mon_recycler.adapter = MeubleAdapter(listMeubles.toTypedArray())
    { item ->
        val intent3 = Intent(this, SceneformeActivity::class.java)
        intent3.putExtra("image_url",item.imageUrl)
        startActivity(intent3)
    }
 }

} My Adapter Class.kt:我的适配器 Class.kt:

// Don't need to pass as a TypedArray - List is fine
class MeubleAdapter(private val exampleList: List<Meuble>,val listener: (Meuble)-> Unit) :
    RecyclerView.Adapter<MeubleAdapter.ExampleViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExampleViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.meuble_item,
            parent, false)
        return ExampleViewHolder(itemView)
    }
    override fun onBindViewHolder(holder: ExampleViewHolder, position: Int) {
        val currentItem = exampleList[position]
        holder.imageView.setImageResource(currentItem.imageResource)
        holder.textViewNomMeuble.text = currentItem.nom
        holder.textViewPrix.text = currentItem.prix
        holder.textViewStock.text = currentItem.stock.toString()

        holder.bind(exampleList[position],listener)
    }

    override fun getItemCount() = exampleList.size


    class ExampleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bind(meuble:Meuble,listener: (Meuble) -> Unit)= with(itemView)
        {
            android.util.Log.i("XXXX","FCT Bind ")
            setOnClickListener{(listener(meuble))}
        }

        val imageView: ImageView = itemView.image_view
        val textViewNomMeuble: TextView = itemView.nomMeuble
        val textViewStock: TextView = itemView.stock
        val textViewPrix: TextView = itemView.prix

    }
}

So i used this solution,, i passed the name (nom) of my clicked object to the SceneFormActivity to get the reference and display my 3D object in the next activity:所以我使用了这个解决方案,我将点击的 object 的名称(标称)传递给 SceneFormActivity 以获取参考并在下一个活动中显示我的 3D object:

code from main主要代码

   val intent3 = Intent(this, SceneformeActivity::class.java)
            intent3.putExtra("image_url",it.nom) //  it.nom to get the name of the object clicked
            startActivity(intent3)

and in SceneformeActivity:在 SceneformeActivity 中:

 private void initializeGallery() {
        String imageUrl = getIntent().getStringExtra("image_url"); // changed this from getInt to getString to get the name
        LinearLayout gallery = findViewById(R.id.gallery_layout);
        String obj =imageUrl;   
        switch (obj) {
            case "fauteilgris": { // case "String": the name of the object clicked in the previous activity(RecyclerView)
                ImageView andy = new ImageView(this);
                andy.setImageResource(R.drawable.fauteilgris);
                andy.setContentDescription("fauteuil Créme");
                andy.setOnClickListener(view ->{addObject(Uri.parse("foteuil.sfb"));});
                gallery.addView(andy);

            }
            break;
            case "banc": {
                ImageView andy = new ImageView(this);
                andy.setImageResource(R.drawable.banc);
                andy.setContentDescription("banc extérieur");
                andy.setOnClickListener(view ->{addObject(Uri.parse("Bench.sfb"));});
                gallery.addView(andy);

            }
            break;
            case "burau": {
                ImageView andy = new ImageView(this);
                andy.setImageResource(R.drawable.burau);
                andy.setContentDescription("bureau");
                andy.setOnClickListener(view ->{addObject(Uri.parse("bureau.sfb"));});
                gallery.addView(andy);

            }
            break;
 default:Toast.makeText(getApplicationContext(),"No Object",Toast.LENGTH_SHORT).show();

                break;

        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 将RecyclerView CardView单击项目数据传递给活动 - Passing RecyclerView CardView Clicked Item Data To Activity 如何在RecyclerView中获取被单击项的位置 - How to get position of clicked item in RecyclerView 使用 dataBinding 在 recyclerView 中获取单击项的位置 - get position of clicked item in recyclerView using dataBinding RecyclerView - 获取选定的位置并将该位置传递给另一个活动,在该活动中将出现相同列表并选择该特定项目 - RecyclerView - Get the selected position and pass the position to another activity where the same list will appear with that specific item selected 在Firebase RecyclerView Cardview中单击项目时如何打开详细信息活动 - How to open a details activity when an item is clicked in Firebase RecyclerView Cardview 如何根据RecyclerView中的单击项在新活动中打开特定片段 - How to open specific Fragment in new Activity depending on clicked item in RecyclerView 单击recyclerView Item时如何将数据获取到webView活动中 - how to get data into webView activity when recyclerView Item is clicked 根据在ListView中单击的项目位置执行活动线程 - Execute a thread of an activity based on item position clicked in ListView 单击第一个 RecyclerView 中的项目时,如何将数据从一个 RecyclerView 流向另一个 RecyclerView? - How to flow Data from One RecyclerView to Another RecyclerView when an item in first RecyclerView is clicked? 使用新创建的项目返回到以前的活动时更新 recyclerView 适配器 - Update recyclerView Adapter on return to previous activity with newly created item
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM