我正在使用Android Studio为Android> = 4开发。 这只是在ANDROID< 5(Pre Lolipop)上发生的。在Lolipop上,ArrayAdapter具有正确的行为。
没有比一些GIFS更好的解释:
我有一个自定义ArrayAdapter,我在其中显示问题。每个项目都有自己的布局,具体取决于其类型:
Array Adapter的每个项目都通过覆盖 getView(int position,View convertView,ViewGroup parent)来扩展相同的布局。我只是通过使用 setVisibility(true)或 setVisibility(false)来显示或隐藏字段,具体取决于问题的类型。
@Override
public View getView(int position, View convertView, ViewGroup parent){
mView = convertView;
if(mView == null){
LayoutInflater mLayoutInflater;
mLayoutInflater = LayoutInflater.from(getContext());
mView = mLayoutInflater.inflate(R.layout.item_liste_question,null);
}
final Question mQuestion = getItem(position);
if(mQuestion != null){
TextView tvQuestion = (TextView) mView.findViewById(R.id.tv_question_nom);
EditText questionNombre = (EditText) mView.findViewById(R.id.et_question_nombre);
EditText questionTexte = (EditText) mView.findViewById(R.id.et_question_texte);
CheckBox questionBool = (CheckBox) mView.findViewById(R.id.cb_question_bool);
tvQuestion.setText(mQuestion.getQuestionLB());
if(mQuestion.getTypeReponse().equals("Num")){
questionTexte.setVisibility(View.GONE);
questionNombre.setVisibility(View.VISIBLE);
questionBool.setVisibility(View.GONE);
}
else if(mQuestion.getTypeReponse().equals("Text")){
questionTexte.setVisibility(View.VISIBLE);
questionNombre.setVisibility(View.GONE);
questionBool.setVisibility(View.GONE);
}
else if(mQuestion.getTypeReponse().equals("Bool")){
questionBool.setVisibility(View.VISIBLE);
questionNombre.setVisibility(View.GONE);
questionTexte.setVisibility(View.GONE);
}
}
return mView;
}
但是当我点击EditText字段时,键盘显示,减少了屏幕的大小,迫使ArrayAdapter撤消屏幕外的项目。在这里,没有任何错误,但这些视图被回收并重复使用,将旧布局与新布局混合使用。
例如:我最初有5个问题:
我点击第一个问题,这是我获得的:
经过大量的测试,我意识到因为第五个问题是从屏幕出来,当我尝试编辑第一个问题时,convertView会给我第五个问题的回收视图。尽管我正在按照自己的意愿重新格式化它,但我仍然有这个神秘的幽灵领域,它使我的键盘变得混乱(不是我想要的数字)。
我可以做些什么才能在Android 5< 5上的Android 5+上拥有相同的正确行为?