Satori_Kanzo
@Satori_Kanzo
Make code not war

ListView не воспринимает string-array в качестве entries, как исправить?

Задача - сделать так, чтобы ListView отображал 3 элемента из string array:
<string-array name="options">
        <item>Drinks</item>
        <item>Food</item>
        <item>Stories</item>
    </string-array>


Вместо этого, он отображает то, что начал отображать с момента его создания (пробовал создавать и через GUI, и через XML) (на скриншоте).

0f185082bb3141958ffc81c450b14936.png

Код самого layout:

<!--Начало кода стандартное-->

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/list_options"
        android:entries="@array/options"/>


</LinearLayout>


UPD: При старте эмулятора - на нем все работает так, как предполагалось. Но в GUI выглядит все также. Поэтому, вопрос остается, хоть и немного проще - по какому месту стукнуть эмулятор, чтобы он уже обновился? =)

Скрин эмулятора (этот парень молодец, отображает все так, как предполагалось)

9e8d745cc01c4320b77218d6a9f3858c.png
  • Вопрос задан
  • 231 просмотр
Решения вопроса 2
SosnovschenkoR
@SosnovschenkoR
Разработчик программного обеспечения
String[] entriesList = getResources().getStringArray(R.array.options);
ListView listView = (ListView)findViewById(R.id.listView1);
adapter = new ArrayAdapter(...,entriesList);
listView.setAdapter(adapter);

Наверно как-то так, ну и поместить это в требуемую секцию инициализации (к примеру onCreate или onOptionsItemSelected)
Ответ написан
enq3
@enq3
Android engineer at #ITX5
Проведем исследование.

ListView.java
public ListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);

        final TypedArray a = context.obtainStyledAttributes(
                attrs, R.styleable.ListView, defStyleAttr, defStyleRes);

        final CharSequence[] entries = a.getTextArray(R.styleable.ListView_entries);
        if (entries != null) {
            setAdapter(new ArrayAdapter<>(context, R.layout.simple_list_item_1, entries));
        }
...


Наследуемся:
attrs.xml
<resources>
    <declare-styleable name="ListView">
        <attr name="entries" format="reference"/>
    </declare-styleable>
</resources>

MyListView.java
public class MyListView extends ListView {
    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);

        final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ListView, 0, 0);
        final CharSequence[] entries = a.getTextArray(R.styleable.ListView_entries);
        if (entries != null) {
            setAdapter(new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, entries));
        }
        a.recycle();
    }
}

MyListView.java
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <test.MyListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:entries="@array/options">
    </test.MyListView>
</RelativeLayout>


Работает как-то не очень. У меня отобразился только 1-ый элемент списка.

Меняем так:
MyListView.java
public class MyListView extends ListView {
    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);

        final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ListView, 0, 0);
        final int resId = a.getResourceId(R.styleable.ListView_entries, 0);
        final CharSequence[] entries = getResources().getTextArray(resId);
        if (entries != null) {
            setAdapter(new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, entries));
        }
        a.recycle();
    }
}

И весь список отобразился.
Отличие вот в этом:
final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ListView, 0, 0);
final CharSequence[] entries = a.getTextArray(R.styleable.ListView_entries);


final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ListView, 0, 0);
final int resId = a.getResourceId(R.styleable.ListView_entries, 0);
final CharSequence[] entries = getResources().getTextArray(resId);

Может и ошибаюсь, но проблема скорее всего где-то внутри TypedArray.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы