3

Я пытаюсь создать хороший макет для моих элементов списка, но мой код работает только тогда, когда она упрощена, как это:ArrayAdapter требует ID быть ошибка TextView

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" 
    android:textSize="16sp" > 
</TextView> 

Когда я добавляю немного больше он компилируется и работает, но сила закрывается на старте и дает мне ошибку ArrayAdapter requires ID to be a TextView:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:padding="6dip" > 

    <ImageView 
     android:id="@+id/icon1" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginRight="6dip" 
     android:src="@drawable/ic_launcher" /> 

    <TextView 
     android:id="@+id/secondLine" 
     android:layout_width="fill_parent" 
     android:layout_height="26dip" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_toRightOf="@id/icon1" 
     android:ellipsize="marquee" 
     android:singleLine="true" 
     android:text="Some more information" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@id/secondLine" 
     android:layout_alignParentTop="true" 
     android:layout_alignWithParentIfMissing="true" 
     android:layout_toRightOf="@id/icon1" 
     android:gravity="center_vertical" 
     android:text="Some Information" /> 

    <ImageView 
     android:id="@+id/icon2" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginRight="6dip" 
     android:src="@drawable/ic_launcher" /> 

</RelativeLayout> 

и

public class FirstLoginActivity extends ListActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     String[] testcontacts = getResources().getStringArray(
       R.array.testcontacts_array); 
     setListAdapter(new ArrayAdapter<String>(this, R.layout.list_items, 
       testcontacts)); 

     ListView lv = getListView(); 
     lv.setTextFilterEnabled(true); 

     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // When clicked, show a toast with the TextView text 
       Toast.makeText(getApplicationContext(), 
         ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

Я уверен, что я делаю это правильно, я прошел через множество учебников, и я обнаружил, что самый быстрый и эффективный способ - создать статический класс ViewHolder. Один из учебников попытался получить доступ к данным напрямую, что я и пытался сделать. Я все еще немного запутался в том, как это сделать.

public class FirstLoginActivity extends ListActivity { 
    Context mContext; 
    List mList; 

    String[] testcontacts = getResources().getStringArray(
      R.array.testcontacts_array); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setListAdapter(new ArrayAdapter<String>(this, R.layout.list_items, 
       testcontacts)); 

     ListView lv = getListView(); 
     lv.setTextFilterEnabled(true); 

     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // When clicked, show a toast with the TextView text 
       Toast.makeText(getApplicationContext(), 
         ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 



    public View getView(int position, View convertview, ViewGroup parent) { 
     ViewHolder holder; 
     View v = convertview; 
     if (v == null) { 
      LayoutInflater inflater = (LayoutInflater) LayoutInflater 
        .from(mContext); 
      v = inflater.inflate(R.layout.list_items, null); 
      holder = new ViewHolder(); 
      holder.firstLine = (TextView) v.findViewById(R.id.firstLine); 
      holder.secondLine = (TextView) v.findViewById(R.id.secondLine); 
      holder.icon1 = (ImageView) v.findViewById(R.id.icon1); 
      holder.icon2 = (ImageView) v.findViewById(R.id.icon2); 
      v.setTag(holder); 
     } else { 
      holder = (ViewHolder) v.getTag(); 
     } 
     holder.firstLine.setText(testcontacts[position]); 
     holder.secondLine.setText(testcontacts[position]); 
     // holder.icon1.setImageBitmap((position & 1) == 1 ? mIcon1: mIcon2); 
     //call the images directly? 
     return v; 
    } 

    static class ViewHolder { 
     TextView firstLine; 
     TextView secondLine; 
     ImageView icon1; 
     ImageView icon2; 

    } 
} 
+0

следуйте первым ответам из приведенной ниже ссылки [http://stackoverflow.com/questions/9280965/arrayadapter-requires-the-resource-id-to-be-a-textview-xml-problems][1] [1]: http: // stackoverflow.com/questions/9280965/arrayadapter-require-the-resource-id-to-be-a-textview-xml-problems – User10001

ответ

2

Вы, вероятно, использовать что-то вроде этого (here the doc):

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.layout_1, values); 

в том случае, если ваш макет должен быть простой макет с TextView.

Если вы хотите использовать свой собственный макет, вам нужно написать собственный адаптер.

1

Создайте свой собственный ArrayAdapter, затем вы можете сделать работу макета, как хотите.

+1

Кроме того, ArrayAdapter имеет другой конструктор, который принимает любой ресурс в качестве ввода, и вы можете указать идентификатор TextView, используемый для заполнения http://developer.android.com/reference/android/widget/ArrayAdapter.html#ArrayAdapter(android.content.Context, int, int, T []). – harism

+0

Можете ли вы направить меня на хороший учебник, который мог бы научить меня, как создать свой собственный listAdapter? –

+1

http://www.youtube.com/watch?v=wDBM6wVEO70 Разве разработчики объясняют, как работают списки, и как заставить их работать правильно. – Pyrodante

0

ArrayAdapter требует, чтобы идентификатор ресурса был исключением XML TextView, это означает, что вы не поставляете то, что ожидает ArrayAdapter. При использовании этого конструктора:

new ArrayAdapter<String>(this, R.layout.a_layout_file, this.file) 

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

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    // other attributes of the TextView 
/> 

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

new ArrayAdapter<String>(this, R.layout.a_layout_file, 
    R.id.the_id_of_a_textview_from_the_layout, this.file) 

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

+0

Что делать, если мой ArrayAdapter использует ячейку, которая является настраиваемой компоновкой и имеет много текстовых представлений в ячейке? – NinjaCoder

+0

Это не проблема. Вместо одиночной кнопки или текстового просмотра вы можете использовать несколько видов в массиве. @NinjaCoder – Sathish

0

Вы, кажется, находитесь на правильном пути. Я не уверен, что проблема с вашим кодом, поскольку я не сравнивал близко, но он работает в this example.

Полный учебник здесь: Android tutorial for beginners - 97 - ListView with Custom Layout

Это позволяет избежать ошибки ArrayAdapter requires ID to be a TextView, которую я также получаю.

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

  • Нет связанных вопросов^_^