【问题标题】:Dynamic and unlimited RecycleView of EditText动态无限制的EditText RecycleView
【发布时间】:2023-01-20 22:09:12
【问题描述】:

我正在尝试创建一个 EditText 的 RecycleView,当您添加带有按钮的 EditText 时,它会在现场更新。

对于 reference,我想要一些类似于在 Gform 上编辑复选框问题的东西,但仅限于 EditTexts。

这是我的代码:

主要活动代码

class AjoutObjectifActivity : AppCompatActivity() {

    //ArrayList used to add items to the RecyclerView
    private var etapes: ArrayList<String> = ArrayList()

    private lateinit var binding: ActivityAjoutObjectifBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityAjoutObjectifBinding.inflate(layoutInflater)
        setContentView(binding.root)

        setupButtons()


    }

    //The click listener of my button
    private fun setupButtons() {
        binding.buttonAddEtape.setOnClickListener{
            addEtape()
        }
    }

    //The function that add one element to my ArrayList, and is supposed to reload my RecyclerView to add the corresponding EditText
    //I know it is supposed to erase all the EditTexts contents as well, but I'm looking to repair this after I manage to add EditTexts
    private fun addEtape() {
        etapes.add("")
        val adapterEtapes = EtapesAdapter(etapes)
        binding.recyclerViewObjectifsEtapes.adapter = adapterEtapes
    }
}

我的“EtapesAdapter”代码

class EtapesAdapter(private val etapes: ArrayList<String>) : RecyclerView.Adapter<EtapesAdapter.EtapeViewHolder>() {

    override fun getItemCount(): Int = etapes.size

    override fun onCreateViewHolder(parent: ViewGroup, position: Int): EtapeViewHolder {
        val view: View = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_etapes_input, parent, false)
        return EtapeViewHolder(view)
    }

    override fun onBindViewHolder(holder: EtapeViewHolder, position: Int) {
        holder.bind(etapes[position])
    }

    class EtapeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        private val etape : TextView = itemView.findViewById(R.id.edit_text_etapes_objectif)

        fun bind(etapes: String) = with(itemView){
            etape.text = etapes
        }
    }


}

我的主要布局

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/recycler_view_objectifs_etapes"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>

</ScrollView>

我的项目布局

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/edit_text_etapes_objectif"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="20dp" />

在使用调试器快速检查变量后,我的 ArrayList 似乎可以正常工作并随着您按下按钮而增长,所以我猜错误一定是在适配器中的某个地方。 我尝试先用 Array 来做,但是因为你不能增加它的大小,所以我决定改用 ArrayList。

请记住,我是初学者,所以可能我使用了错误类型的变量或视图,在这种情况下,请随时告诉我!

提前致谢

【问题讨论】:

    标签: kotlin android-recyclerview android-edittext dynamic-list


    【解决方案1】:

    如果您像这样跟踪适配器本身中的“etapes”,效果会更好。

    class EtapesAdapter : RecyclerView.Adapter<EtapesAdapter.EtapeViewHolder>() {
    private val etapes = ArrayList<String>()
        fun addEtape(etape: String) {
            this.etapes.add(etape)
            notifyDataSetChanged()
        }
    
        fun addEtapes(etapes: ArrayList<String>) {
            this.etapes.addAll(etapes)
            notifyDataSetChanged()
        }
    
        override fun getItemCount(): Int = etapes.size
    
        override fun onCreateViewHolder(parent: ViewGroup, position: Int): EtapeViewHolder {
            val view: View = LayoutInflater.from(parent.context)
                .inflate(R.layout.item_etapes_input, parent, false)
            return EtapeViewHolder(view)
        }
    
        override fun onBindViewHolder(holder: EtapeViewHolder, position: Int) {
            holder.bind(etapes[position])
        }
    
        class EtapeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    
            private val etape : TextView = itemView.findViewById(R.id.edit_text_etapes_objectif)
    
            fun bind(etapes: String) = with(itemView){
                etape.text = etapes
            }
        }
    
    
    }
    

    所以现在你可以这样做:

    val adapterEtapes = EtapesAdapter()
    binding.recyclerViewObjectifsEtapes.adapter = adapterEtapes
    binding.recyclerViewObjectifsEtapes.layoutManager = LinearLayoutManager()
    adapterEtapes.addEtapes(etapes)
    

    它应该重新加载列表。

    【讨论】:

      猜你喜欢
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      相关资源
      最近更新 更多