Android: расширяемый список с различными дочерними макетами - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь создать расширяемый вид списка, где последний элемент каждого списка содержит EditText и другие элементы, содержащие TextViews. Код, который я дошел до сих пор:

@Override
public View getChildView(int groupPosition, final int childPosition,
                         boolean isLastChild, View convertView, ViewGroup parent) {
    MainActivity.ViewHolder holder = null;
    final String childText = (String) getChild(groupPosition, childPosition);
    boolean bLastChild = childPosition == _listDataChild.get(groupPosition).size() - 1;

    if (convertView == null) {
        holder = new MainActivity.ViewHolder();
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if(bLastChild) {
            convertView = infalInflater.inflate(R.layout.list_edit_item, null);
        }else {
            convertView = infalInflater.inflate(R.layout.list_item, null);
            holder.textView = (TextView) convertView.findViewById(R.id.text);
        }
        convertView.setTag(holder);
    } else {
        holder = (MainActivity.ViewHolder)convertView.getTag();
    }

    if(!bLastChild) {
        holder.textView.setText(childText);
    }

    return convertView;
}

Теперь у меня есть следующая проблема:

Если я расширяю группу в первый раз, она работает. Но когда я сворачиваю группу и расширяю ее во второй раз, приложение вылетает, и я получаю сообщение об ошибке:

java.lang.NullPointerException: попытка вызвать виртуальный метод void android.widget.TextView.setText (java.lang.CharSequence) 'с нулевым значением ссылка на объект

Полагаю, это происходит потому, что holder.textView.setText(childText); вызывается, когда держатель ссылается на макет с помощью EditText. Но я не знаю, почему это происходит

Основная идея этого кода происходит от здесь

EDIT

После некоторой регистрации я обнаружил, что во второй раз, когда группа расширяется, getChildView вызывается один раз для каждого потомка, а затем еще один раз при childPosition = 0, но convertView остается таким же, как в вызове из последней дочерней позиции:

childPosition: 0; convertView: android.widget.LinearLayout {a049868 V.E ...... ........ 0,157-1080,244} childPosition 1; convertView: android.widget.LinearLayout {6f19175 V.E ...... ........ 0,247-1080,334} childPosition 2; convertView: android.widget.LinearLayout {4aac50a ​​V.E ...... ........ 0,337-1080,424} childPosition 3; convertView: android.widget.LinearLayout {47b217b V.E ...... ........ 0,427-1080,514} childPosition 4; convertView: android.widget.LinearLayout {cc2eb98 V.E ...... ........ 0,517-1080,604} childPosition 5; convertView: android.widget.LinearLayout {256cff1 V.E ...... ........ 0,607-1080,694} childPosition 6; convertView: android.widget.LinearLayout {7b827d6 V.E ...... ........ 0,697-1080,786} childPosition 0; convertView: android.widget.LinearLayout {7b827d6 V.E ...... ........ 0,697-1080,786}

1 Ответ

0 голосов
/ 28 апреля 2018

Решил проблему, переопределив следующие две функции:

@Override
public int getChildTypeCount(){
    return 2;
}

@Override
public int getChildType(final int groupPosition, final int childPosition){
    if (childPosition == _listDataChild.get(groupPosition).size() - 1){
        return 1;
    }else{
        return 0;
    }
}
...