【问题标题】:Return the correct item position clicked in RecyclerView to another activity将 RecyclerView 中单击的正确项目位置返回到另一个活动
【发布时间】:2020-07-28 15:35:21
【问题描述】:

我在这个问题上苦苦挣扎了好几个星期,但我总是从 RecyclerView 返回 (1)

  • 我想将单击的正确项目位置返回给 SceneFormeActivity 以便能够选择正确的对象,但我每次都得到相同的“1”,因此相同的 Case1'对象信息

我的主要 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)
        }
     }
 }

我的适配器类.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

    }
}

我应该在 SceneFormeActivity.java 中获取项目位置的函数

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;

        }
    }

【问题讨论】:

  • “总是从 RecyclerView 返回 (1)”,因为您将 1 传递给 Intent intent3.putExtra("image_url",1) 将 1 从 onBind(..) 方法更改为位置
  • 您可以放置​​一个可见性 GONE 的 TextView 并将您的 id 保存到 RecyclerView,之后通过简单的 id 检查更容易处理项目的数据
  • @chandmohd 这是我的问题,我不知道如何从 bind(..) 获取位置到 buildRecycleView 适配器
  • @luisenricke 我明白了,我会试试谢谢

标签: java android kotlin android-recyclerview android-adapter


【解决方案1】:

如果您真正想要的是项目的位置,那么您根本不需要在点击时发送 Meuble。在您的适配器中将 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)
    }

现在设置您的适配器应该如下所示:

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

编辑:扩展适配器的使用:

最初,您将两件事传递给您的 Recyclerview 适配器 -

  1. Meuble 列表(无需将其转换为 TypedArray
  2. 将作用于单击列表中的项目的 lambda

使用我的内联 cmets 考虑下面的重构代码。注意 - 我不清楚你为什么要发送位置(假设只是为了测试?)所以我假设你希望发送的对象中有一些 imageURL。我将在下面展示您如何访问它。

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)
    }
 }

} 我的适配器类 .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

    }
}

【讨论】:

  • 您好,感谢您的回复,我不能只在 holder.bind 中传递位置,但是我尝试将函数绑定更改为仅采用 Int Position 参数,但调用它时遇到问题因为 position -> return un object not int ,所以我认为我的问题是我不知道如何获取这里传递的数据 holder.bind(exampleList[position],listener) ``` mon_recycler.adapter = MeubleAdapter(listMeubles .toTypedArray()) { val intent3 = Intent(this, SceneformeActivity::class.java) intent3.putExtra("image_url",1) // 替换 1 } ```
  • 你的意思是说你不明白如何处理传递给你的lambda的对象?
  • 你实际上帮助我理解了更多的主题,谢谢,但是我希望单击项目的位置将其发送到我的下一个活动并选择正确的 3D 对象以显示 3D,但每次都在 putExtra我只获得了传入 onBindViewHolder 的 4 个属性(imageResource、prix、name、Stock),我不知道即使我获得了位置,我的第一个想法是否也行不通,所以我使用了单击的对象的名称和比较(开关案例(名称))与对象的名称,它的工作谢谢你帮助我了解更多适配器的工作
【解决方案2】:

所以我使用了这个解决方案,我将点击对象的名称(nom)传递给 SceneFormActivity 以获取引用并在下一个活动中显示我的 3D 对象:

主代码

   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)

在 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;

        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多