【问题标题】:How to clear EditText input from all item views of RecyclerView?如何从 RecyclerView 的所有项目视图中清除 EditText 输入?
【发布时间】:2019-07-01 13:13:48
【问题描述】:

我正在寻找解决方案来迭代我的 Recycler View Adapter 元素的所有视图以获取 EditTexts 并更改输入。

我使用 RecyclerView 列表。项目行包含 EditText。当用户单击一个按钮时,我想清除所有项目视图的输入,即使是那些尚未绑定的。我该怎么做?

class ScoresAdapter : RecyclerView.Adapter<ScoresViewHolder>() {

private var scores: List<Score> = ArrayList()
private var listener: ScoreItemListener? = null

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ScoresViewHolder {
    val view =
        LayoutInflater
            .from(parent.context)
            .inflate(R.layout.score_item, parent, false)

    return ScoresViewHolder(view)
}

override fun getItemCount(): Int {
    return scores.size
}

override fun onBindViewHolder(holder: ScoresViewHolder, position: Int) {
    val score = scores[position]

    holder.playerView.text = score.player.email
    holder.totalScoreView.text = score.total().toString()
}

fun setItemListener(listener: ScoreItemListener) {
    this.listener = listener
}

fun loadScores(scores: ArrayList<Score>) {
    this.scores = scores
    notifyDataSetChanged()
}

fun clearInputs() {
    // for all scores in list remove text from EditText and set ""
}

inner class ScoresViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var playerView = itemView.findViewById<TextView>(R.id.player)!!
    var currentScoreView = itemView.findViewById<EditText>(R.id.current_score)!!
    var totalScoreView = itemView.findViewById<TextView>(R.id.total_score)!!

    init {
        setTextChangedListener(itemView)
    }

    private fun setTextChangedListener(itemView: View) {
        if (listener != null)
            currentScoreView.addTextChangedListener(object : TextWatcher {
                override fun afterTextChanged(s: Editable?) {

                }

                override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {

                }

                override fun onTextChanged(text: CharSequence?, start: Int, before: Int, count: Int) {
                    listener!!.textChanged(itemView, text!!.toString(), adapterPosition)
                }

            })
    }
}
}

【问题讨论】:

  • 你试过your_edittext.text = "" or your_edittext.setText("")吗?

标签: android kotlin android-recyclerview


【解决方案1】:

您可以执行以下操作::

var clearEditText = false

override fun onBindViewHolder(holder: ScoresViewHolder, position: Int) {
    val score = scores[position]

    holder.playerView.text = if(clearEditText) "" else score.player.email
    holder.totalScoreView.text = score.total().toString()
}


fun clearInputs() {
    clearEditText = true
    notifyDataSetChanged();
}

【讨论】:

  • 这个函数怎么叫先生?我认为它需要任何像清除按钮这样的听众?
  • 在按钮上单击只需从您的活动或片段中调用:adapter.clearInputs() 其中适配器是您的 recyclerview 适配器的实例。
【解决方案2】:

我知道您稍后可能需要将EditText 输入保存为currentScoreScore

假设这个和currentScoreString

在java中:

public void clearInputs() {
 for(Score score: scores) {
  score.currentScore = "";
 }
 notifyDataSetChanged();
}

在 Kotlin 中:

fun clearInputs() {
  for (score in scores)
  {
    score.currentScore = ""
  }
  notifyDataSetChanged()
}

【讨论】:

    【解决方案3】:

    试试这个可能有用

    override fun onBindViewHolder(holder: ScoresViewHolder, position: Int) {
        val score = scores[position]
    
        holder.playerView.text = if(clearEditText) "" else score.player.email
        holder.totalScoreView.text = score.total().toString()
        holder.currentScoreView.setText("")
    }
    
    public void clearInputs() {
     notifyDataSetChanged();
    }
    

    【讨论】:

    • 您的代码存在一些小问题,您没有将Boolean 值设置为clearEditText,那么如果条件恢复了怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 2014-05-28
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多