Android自定义ListView - 当软键盘隐藏时Edittext被清除

问题描述:

我有一个自定义listview用于填充列表,所以每个项目都有它自己的edittext。当我点击它们并键入某个值时,然后隐藏软键盘(键盘左下角的小指向箭头),编辑文本将丢失键入的文本。Android自定义ListView - 当软键盘隐藏时Edittext被清除

为什么以及如何防止它?

谢谢!

适配器的代码:

public class CompetitorResultWeightListAdapter extends ArrayAdapter<Competitor> { 

    Helper helper = new Helper(getContext()); 

    private DatabaseReference databaseResult; 

    private Activity context; 
    private List<Competitor> competitorList; 
    private WodResult wodResult; 

    public CompetitorResultWeightListAdapter(Activity context, List<Competitor> competitorList) { 
     super(context, R.layout.competitor_result_weight_list_layout, competitorList); 
     this.context = context; 
     this.competitorList = competitorList; 
    } 

    @NonNull 
    @Override 
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
     helper.logD("in CompetitorResultWeightListAdapter - getView"); 
     databaseResult = FirebaseDatabase.getInstance().getReference("Competitions").child(helper.getsCompetitionID()) 
       .child("Wods").child(helper.getsWodID()).child("Results"); 

     LayoutInflater layoutInflater = context.getLayoutInflater(); 

     convertView = layoutInflater.inflate(R.layout.competitor_result_weight_list_layout, null, true); 

     final ViewHolder viewHolder = new ViewHolder(); 

     TextView tvCompetitorListName = (TextView) convertView.findViewById(R.id.tvCompetitorListName); 
     TextView tvCompetitorListNumber = (TextView) convertView.findViewById(R.id.tvCompetitorListNumber); 
     viewHolder.etWeight = (EditText) convertView.findViewById(R.id.etCompetitorResultWeight); 
     viewHolder.btnSaveResult = (ImageButton) convertView.findViewById(R.id.btnCompetitorResultRepeat); 
     convertView.setTag(viewHolder); 

     Competitor competitor = competitorList.get(position); 

     tvCompetitorListName.setText(competitor.getCompetitorName()); 
     tvCompetitorListNumber.setText("Rajtszám: " + competitor.getCompetitorNumber()); 

     //viewHolder.etWeight.setHint("működik"); 
     //etCompetitorResultWeight.setInputType(InputType.TYPE_NULL); 
     //etCompetitorResultWeight.setTextIsSelectable(true); 

     viewHolder.btnSaveResult.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       viewHolder.etWeight.setHint(viewHolder.etWeight.getText() + " kg"); 
       helper.logD("Edittext text at position " + position + ": " + viewHolder.etWeight.getText().toString().trim()); 
       helper.setsCompetitorID(getItem(position).getCompetitorID()); 
       addWodResult(getItem(position).getCompetitorID(), 
         getItem(position).getCompetitorName(), 
         viewHolder.etWeight.getText().toString().trim()); 
      } 
     }); 

     return convertView; 
    } 

    private void addWodResult(String id, String name, String result) { 
     helper.logD("in addWodResult"); 
     helper.logD("id: " + id + ", name: " + name + ", result: " + result); 

     wodResult = new WodResult(id, name, result); 

     databaseResult.child(helper.getsCompetitorID()).setValue(wodResult).addOnCompleteListener(new OnCompleteListener<Void>() { 
      @Override 
      public void onComplete(@NonNull Task<Void> task) { 
       if (task.isSuccessful()) { 
        helper.makeToast(getContext().getResources().getString(R.string.wod_result_data_saved), helper.toastShort); 
        //viewHolder.btnRepeatResult.setBackgroundColor(Color.GREEN); 
       } else { 
        helper.makeToast(getContext().getResources().getString(R.string.firebase_data_stored_error), helper.toastShort); 
       } 
      } 
     }); 
    } 

    public class ViewHolder { 
     EditText etWeight; 
     ImageButton btnSaveResult; 
    } 
} 
+0

你用过'ViewHolder',看起来好像没有。 – samirk433

+0

不,我没有。我修改它并给你一个更新,谢谢。 – lpasztor

+0

与查看者相同。我编辑问题并添加代码。请检查一下。 – lpasztor

这听起来像你的活动/片段可被重建每一个键盘消失的时间。在你的onStart()中加入一些日志语句,看看是否是这种情况。

在最起码你可以尝试在清单中加入一些configChanges你的活动:

<activity android:name=".MyActivity" 
     android:configChanges="orientation|keyboardHidden" 
     android:label="@string/app_name"> 

这也有可能是你完全重新创建的ListView /适配器,这也将重置所有值。将日志语句放入ListView的填充位置,以查看是否多次调用该语句。通常这个状态应该被保存。

你也应该考虑,尽快为他们完成打字的临时办法(喜好,辛格尔顿级别的对象),节省了用户的数据 - 你可以利用这一点,但也有其他的方法太:https://developer.android.com/reference/android/text/TextWatcher.html

+0

我检查了(遵循你的建议),并且在键盘隐藏时,适配器的getview被称为几次,即使当我在edittext内部单击时......那也不行。 – lpasztor

+0

getView将被调用,因为通常在键盘后面的项目正在被填充。我更关心整个适配器被重制。 – wblaschko

+0

这就是我所做的,我从零重写了整个适配器,但结果是一样的。 – lpasztor