无法在RecyclerView的ViewHolder中获取EditText的值

时间:2019-03-22 15:30:26

标签: android android-recyclerview

在我的应用中,作为ViewHolder的一部分,我有一个带有可编辑EditText视图的RecyclerView,请参见图片:

RecyclerView with ViewHolders and EditText views

用户可以编辑EditText视图的值。要将更改后的值保存回相关适配器,请将OnFocusChangeListener设置为EditText视图,并在它们失去焦点后立即存储(已更改)值,请参阅以下代码段,摘录自适配器的onBindViewHolder方法:

// Add listener to views
        holder.fpuView.setOnFocusChangeListener((v, hasFocus) -> {
            if (!hasFocus) {
                // Focus has gone, so save value to adapter
                mAbsorptionBlocks.get(position).setMaxFPU(Integer.valueOf(holder.fpuView.getText().toString()));
            }
        });
        holder.absorptionTimeView.setOnFocusChangeListener((v, hasFocus) -> {
            if (!hasFocus) {
                // Focus has gone, so save value to adapter
                mAbsorptionBlocks.get(position).setAbsorptionTime(Integer.valueOf(holder.absorptionTimeView.getText().toString()));
            }
        });

这很好,只要用户点击另一个EditText视图即可。

如果用户在更改EditText的值后立即直接单击“保存”按钮,则该按钮不起作用。 EditText似乎无法识别已失去焦点。这可能是由于“保存”按钮不属于RecyclerView,而是属于父活动。

我尝试了其他听众选项,但是现在我很迷路。用户在编辑值后直接单击“保存”按钮,是否有机会抓住更改的值?

2 个答案:

答案 0 :(得分:1)

改为使用OnTestChangeListener。然后,根据需要捕获文本更改后事件或实时捕获。这样,您就不必依赖焦点更改事件来获取文本。

答案 1 :(得分:1)

您必须使用EditText的这些方法

holder.fpuView.addTextChangedListener(new 
TextWatcher() {

 @Override
  public void afterTextChanged(Editable s) {}

  @Override    
  public void beforeTextChanged(CharSequence s, int 
  start,int count, int after) {
  }

  @Override    
  public void onTextChanged(CharSequence s, int start,
  int before, int count) {
     if(s.length() != 0) {  
        mAbsorptionBlocks.get(position). setMaxFPU(Integer.valueOf(holder.fpuView.getText().toString()));
     }else{
            // add default value when EditText is empty. 
      }     

} });