Проведем исследование.
ListView.javapublic 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.javapublic 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.javapublic 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.