kotlin 在RecyclerView中获取多个/动态EditText值

qoefvg9y  于 12个月前  发布在  Kotlin
关注(0)|答案(1)|浏览(159)

我是新的这些情况下,我想尝试获得动态EditText(s)从RecyclerView的值。


的数据
在布局中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_marginTop="@dimen/_10sdp"
    android:layout_height="wrap_content">

    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/tv_question"
        style="@style/textH4"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="bottom"
        android:text="Ini adalah tempat pertanyaan pertama" />

    <androidx.appcompat.widget.AppCompatEditText
        android:id="@+id/et_answer"
        android:layout_width="match_parent"
        android:layout_height="@dimen/_120sdp"
        android:hint="Tulis jawaban anda"
        style="@style/EdittextPrimary"
        android:gravity="top"
        android:background="@drawable/bg_outline_grey"
        android:inputType="textMultiLine"
        android:layout_marginTop="@dimen/_10sdp"/>

</LinearLayout>

字符串
问题是。如何获取EditText值并将其放入ArrayList中?

***最新的更新代码:***我添加了我的回收适配器,并尝试了这些:

class RequestJoinAdapter(
    val onTextChanged: (text:String,position:Int)->Unit
) :
    RecyclerView.Adapter<RequestJoinAdapter.ViewHolder>() {

    var listData: MutableList<KeamananModel> = ArrayList()

    private var textValue = ""

    fun insertAll(data: List<KeamananModel>) {
        data.forEach {
            listData.add(it)
            notifyItemInserted(listData.size - 1)
        }
    }

    fun clear() {
        if (listData.isNotEmpty()) {
            listData.clear()
            notifyDataSetChanged()
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            ItemRequestJoinBinding.inflate(
                LayoutInflater.from(parent.context),
                parent,
                false
            )
        )
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = listData[position]
        holder.bindTo(item)

        holder.binding.etAnswer.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
            override fun afterTextChanged(s: Editable?) {
                onTextChanged.invoke(s.toString(), position)
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                textValue = s.toString().toLowerCase()
            }
        })

    }

    override fun getItemCount() = listData.size

    inner class ViewHolder(val binding: ItemRequestJoinBinding) :
        RecyclerView.ViewHolder(binding.root) {

        fun bindTo(item: KeamananModel) {

            val context = binding.root.context

            binding.tvQuestion.text = item.qt
        }

    }

    private fun isLog(msg: String) {
        Log.e("join grup:", msg)
    }

}


在我当前的Activity中,我曾经添加一些代码,如

RequestJoinAdapter { text, position ->
            val values = ArrayList<Jawaban>()
            val hashSet = HashSet<Jawaban>()
            values.add(Jawaban(pertanyaan_no = position+1, jawaban = text))
            hashSet.addAll(values)
            values.clear()
            values.addAll(hashSet)
            val valuest = ArrayList<JawabanKeamanan>()
            val hashSets = HashSet<JawabanKeamanan>()
            valuest.add(JawabanKeamanan(values))
            hashSets.addAll(valuest)
            valuest.clear()
            valuest.addAll(hashSets)
            isLog("currentResult: $valuest")
        }


我如何将我最新的 valuest 设置到我的var listJawaban: MutableList<JawabanKeamanan> = ArrayList()中,而不会在其中有任何重复的数据?我想要的是JawabanKeamanan(jawaban_keamanan=[Jawaban(pertanyaan_no=1, jawaban=t)], [Jawaban(pertanyaan_no=2, jawaban=u)])。谢谢...

yshpjwxd

yshpjwxd1#

最简单的答案是对EditText实现一个TextWatcher,并在文本更改时返回数据。
现在你可能会问我如何在我的活动中获得这些数据?其实很简单。在适配器中创建一个接口以与Activity通信。
将接口作为构造函数参数传递,以便在Activity中初始化适配器时实现方法。
另一种解决方案是在列表的每个项目中添加一个按钮,并在按钮的OnClickListener中调用接口方法。

**编辑:**在下面的代码片段中,我使用了一个lambda函数来处理文本的变化。

class RequestJoinAdapter(
      private val onClickedItem: (ArrayList<String>)->Unit,
      val onTextChanged: (text:String,position:Int)->Unit
    ):
      RecyclerView.Adapter<RequestJoinAdapter.ViewHolder>() {
    
      var listData: MutableList<KeamananModel> = ArrayList()
    
      var listJawaban: MutableList<Jawaban> = ArrayList()
    
      private var textValue = ""
    
      fun insertAll(data: List<KeamananModel>) {
        data.forEach {
          listData.add(it)
          notifyItemInserted(listData.size - 1)
        }
      }
    
      fun clear() {
        if (listData.isNotEmpty()) {
          listData.clear()
          notifyDataSetChanged()
        }
      }
    
      override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
          ItemRequestJoinBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
          )
        )
      }
    
      override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = listData[position]
        holder.bindTo(item)
    
      }
    
      override fun getItemCount() = listData.size
    
      inner class ViewHolder(val binding: ItemRequestJoinBinding):
        RecyclerView.ViewHolder(binding.root) {
    
        fun bindTo(item: KeamananModel) {
    
          val context = binding.root.context
    
          binding.tvQuestion.text = item.qt
          
          binding.etAnswer.addTextChangedListener(object: TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
            override fun afterTextChanged(s: Editable?) {
              if (textValue.isNotEmpty()) {
                isLog(textValue)
                
                onTextChanged.invoke(s,absoluteAdapterPosition)
              } else {
    
              }
              listJawaban.add(Jawaban(pertanyaan_no = adapterPosition + 1, jawaban = textValue))
              isLog(listJawaban.toString())
            }
        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
          textValue = s.toString().toLowerCase()
        }
      })
    }

  }

  private fun isLog(msg: String) {
    Log.e("join grup:", msg)
  }

}

字符串
注意onTextChanged.invoke()方法。这个lambda函数可以像接口一样在适配器和视图之间进行通信。每次更改文本时都会触发此功能。
最后示例化你的适配器如下:

val adapter = RequestJoinAdapter({

    }, { text, position ->
        //onTextChanged
    })


position参数用于帮助您了解哪个TextView被更改

相关问题