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;
}
}
答
这听起来像你的活动/片段可被重建每一个键盘消失的时间。在你的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
你用过'ViewHolder',看起来好像没有。 – samirk433
不,我没有。我修改它并给你一个更新,谢谢。 – lpasztor
与查看者相同。我编辑问题并添加代码。请检查一下。 – lpasztor