0

Я пытаюсь реализовать код, в котором список линейных макетов вставляется в представление списка с помощью адаптера массива. Каждый линейный макет содержит два подзаголовка. Вот xml.Android: ArrayAdapter требует, чтобы идентификатор ресурса был TextView?

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/list_item" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ImageView 
     android:id="@+id/list_icon" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="10dp"/> 

    <TextView 
     android:id="@+id/list_label" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_marginLeft="10dp" 
     android:padding="10dp" 
     android:textSize="16sp" /> 

</LinearLayout> 

Теперь во фрагменте я создал фрагмент кода, подобный этому.

final String[] my_page_items = getResources().getStringArray(R.array.my_page_items); 

    int[] my_page_icons = { 
      R.mipmap.ic_about, 
      R.mipmap.ic_app_settings, 
      R.mipmap.ic_account_settings, 
      R.mipmap.ic_logout 
    }; 

    LinearLayout[] items = new LinearLayout[my_page_items.length]; 
    TextView[] labels = new TextView[my_page_items.length]; 
    ImageView[] icons = new ImageView[my_page_icons.length]; 

    for(int i=0; i<my_page_icons.length; i++) { 
     items[i] = (LinearLayout) LayoutInflater.from(getActivity().getApplication()).inflate(R.layout.list_item, null); 
     labels[i] = (TextView) items[i].findViewById(R.id.list_label); 
     icons[i] = (ImageView) items[i].findViewById(R.id.list_icon); 

     labels[i].setText(my_page_items[i]); 
     icons[i].setBackground(getResources().getDrawable(my_page_icons[i])); 
    } 


    setListAdapter(new ArrayAdapter<>(getActivity(), R.layout.list_item, items)); 
    lv = getListView(); 

    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

    }); 

Когда я запускаю этот код, я получаю следующее в логарифме.

java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView 

Как решить эту проблему?

ответ

0

В

new ArrayAdapter<>(getActivity(), R.layout.list_item, items) 

R.Layout.list_item должен быть идентификатор файла макета XML, содержащий только TextView (в TextView не может быть обернут кириллице, как LinearLayout, RelativeLayout и т.д.!),

EDIT Возможное решение:

Если вы хотите, чтобы ваш макет строки списка был чем-то иным, а простой виджет TextView использовал этот конструктор:

new ArrayAdapter<>(getActivity(), R.layout.list_item, R.id.id_of_your_textview items) 

где вы поставляете идентификатор макета, который может содержать различные точки зрения, но и должны содержать TextView с и идентификатор (третий параметр), который вы передаете ваш ArrayAdapter, чтобы он мог знать, где поставить струны в макете строк.

+0

Любые предложения по решениям? – MarshallLee

+0

вы можете создать пользовательский BaseAdapter –

+0

вы можете сослаться на http://stackoverflow.com/questions/9280965/arrayadapter-requires-the-resource-id-to-be-a-textview-xml-problems для этой ошибки –

Смежные вопросы