ArrayAdapter的再循环convertView将我的旧布局与新布局混合(ANDROID< 5)

时间:2015-06-01 13:05:53

标签: android android-layout listview android-listview android-arrayadapter

我正在使用Android Studio为Android> = 4开发。 这只是在ANDROID< 5(Pre Lolipop)上发生的。在Lolipop上,ArrayAdapter具有正确的行为。

没有比一些GIFS更好的解释:

Android 5

Android 4

我有一个自定义ArrayAdapter,我在其中显示问题。每个项目都有自己的布局,具体取决于其类型:

  • 数值:Label + Numeric EditText
  • 文本值:Label + EditText多行
  • 布尔值:标签+复选框

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个问题:

  • 问题1 - EditText(数字)
  • 问题2 - EditText(数字)
  • 问题3 - EditText(数字)
  • Question4 - EditText(Multilines)
  • 问题5 - 复选框

我点击第一个问题,这是我获得的:

  • 问题1 - EditText(数字)+奇怪的鬼场
  • 问题2 - EditText(数字)
  • 问题3 - EditText(数字)
  • Question4 - EditText(Multilines)
  • (问题5 - 屏幕外的复选框)

经过大量的测试,我意识到因为第五个问题是从屏幕出来,当我尝试编辑第一个问题时,convertView会给我第五个问题的回收视图。尽管我正在按照自己的意愿重新格式化它,但我仍然有这个神秘的幽灵领域,它使我的键盘变得混乱(不是我想要的数字)。

我可以做些什么才能在Android 5< 5上的Android 5+上拥有相同的正确行为?

0 个答案:

没有答案