Почему инфляция макета приводит к исчезновению текстового представления в списке?

Поэтому я использую пользовательскую реализацию ArrayAdapter, чтобы иметь доступ к кнопке переключения внутри моих элементов списка.

Каждое представление списка имеет текстовое представление и кнопку-переключатель. Мне пришлось использовать пользовательский ArrayAdapter, прикрепленный к списку, чтобы я мог получить правильную кнопку переключения, прикрепленную к положению списка, который был нажат. Тем не менее, каждый раз, когда я раздуваю макет, чтобы получить представление, текстовое представление в списке исчезает. Значения все еще там, но textview нет. Однако кнопки переключения отображаются нормально. Это код, используемый для раздувания макета и получения представления:

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            v = inflater.inflate(R.layout.activity_alarm_item, parent, false);
        }
        ToggleButton toggle = (ToggleButton) v.findViewById(R.id.alarm_status);
        toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    Log.d("ENABLE ALARM", Integer.toString(position));
                    enableAlarm(position);
                } else {
                    disableAlarm(position);
                }

            }
        });
        return v;
    }

Что-то не так с двумя линиями, которые раздувают макет?

Планировка в порядке. Я вернулся к исходному адаптеру, и текст textview вернулся.

Однако вот схема действий:

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp" >

    <TextView
        android:id="@+id/time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:textIsSelectable="false"
        android:textSize="20sp"
        android:paddingLeft="5dp" />


    <ToggleButton
        android:id="@+id/alarm_status"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:clickable="true"
        android:onClick="enableAlarm"
        android:background="?android:attr/selectableItemBackground"
        android:focusable="false" />

    <TextView
        android:layout_width="1px"
        android:layout_height="fill_parent"
        android:layout_toLeftOf="@id/alarm_status"
        android:layout_centerVertical="true"
        android:background="?android:attr/dividerVertical" />

    </RelativeLayout>

person user10297    schedule 13.11.2013    source источник
comment
Пожалуйста, опубликуйте свой xml-код activity_alarm_item.   -  person Rethinavel    schedule 13.11.2013
comment
Планировка в порядке. Я вернулся к исходному адаптеру, и текст textview вернулся.   -  person user10297    schedule 13.11.2013
comment
Кажется, это проблема, когда макет раздут. Один из параметров неверный, типа не используется рут?   -  person user10297    schedule 13.11.2013


Ответы (2)


Где вы устанавливаете текст на TextView ? TextView кажется пустым. Вот почему он не отображается, я думаю.

Либо установите текст на TextView в самом файле Xml

android:text ="text"

или внутри функции getView

TextView textView = (TextView) v.findViewById(R.id.time);
textView.setText("Text");
person Abhishek V    schedule 13.11.2013
comment
Но текст поступает из базы данных и устанавливается для каждого элемента списка, который поступает из массива, подключенного к адаптеру. - person user10297; 13.11.2013
comment
По крайней мере, попробуйте выразить это так, как показывает @AbhishekV, чтобы проверить, не здесь ли проблема. - person HpTerm; 13.11.2013
comment
На самом деле это обходной путь. Хотя мне пришлось его немного подправить. Я не знал, что он установит каждый элемент. - person user10297; 13.11.2013
comment
@user10297 user10297 Текст не будет автоматически установлен на TextView, так как вы используете пользовательский адаптер. Внутри метода getView получите текст из массива, используя position в качестве индекса, и установите для него значение TextView. - person Abhishek V; 13.11.2013

Слишком долго писать в комментарии, попробую как ответ. Я не уверен, что вы правильно понимаете контекст. Лично в пользовательском адаптере я объявляю инфлятор макета следующим образом:

private LayoutInflater mInflater = (LayoutInflater)   
                getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

затем я использую инфлятор в getView() следующим образом

v = mInflater.inflate(R.layout.activity_alarm_item, parent, false);

Скажите, решит ли это вашу проблему, иначе я удалю свой ответ.

person HpTerm    schedule 13.11.2013
comment
Стоило попробовать. Так что не знаю в чем проблема. - person HpTerm; 13.11.2013