Problemas xml "ArrayAdapter requiere que la ID del recurso sea un TextView"

181

Recibo un error al intentar configurar mi vista para mostrar ListViewel archivo que quiero mostrar (archivo de texto). Estoy bastante seguro de que tiene algo que ver con el xml. Solo quiero mostrar la información de this.file = fileop.ReadFileAsList("Installed_packages.txt");. Mi código:

public class Main extends Activity {
    private TextView tv;
    private FileOperations fileop;
    private String[] file;

    /** Called when the activity is first created. */       
    @Override
    public void onCreate(Bundle savedInstanceState) {           
        super.onCreate(savedInstanceState); 
        this.fileop = new FileOperations(); 
        this.file = fileop.ReadFileAsList("Installed_packages.txt"); 
        setContentView(R.layout.main);
        tv = (TextView) findViewById(R.id.TextView01);
        ListView lv = new ListView(this);
        lv.setTextFilterEnabled(true); 
        lv.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, this.file)); 
        lv.setOnItemClickListener(new AdapterView.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(); 
              } 
        });         
        setContentView(lv);
    }

}

list_item.xml :

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

</LinearLayout>

main.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:weightSum="1">
<ScrollView
    android:id="@+id/SCROLLER_ID"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"
    android:fillViewport="true">
        <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:padding="5sp"
        android:id="@+id/TextView01"
        android:text="@string/hello"/>
    </ScrollView>

</LinearLayout>
PeterL
fuente

Respuestas:

428

El ArrayAdapter requiere el ID de recurso a ser un TextView XML medios de excepciones no proporciona lo que la ArrayAdapterEspera. Cuando usas este constructor:

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

R.Layout.a_layout_filedebe ser la identificación de un archivo de diseño xml que contenga solo un TextView( TextView no puede ser envuelto por otro diseño, como un LinearLayout, RelativeLayoutetc.), algo como esto:

<?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
/>

Si desea que el diseño de la fila de su lista sea algo diferente, entonces un TextViewwidget simple use este constructor:

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

donde proporciona idun diseño que puede contener varias vistas, pero también debe contener un TextViewcon y id(el tercer parámetro) que pasa a su ArrayAdapterpara que pueda saber dónde colocar el Stringsdiseño en la fila.

Luksprog
fuente
2
Tuve el mismo problema porque mi TextView estaba dentro de un LinearLayout en el archivo xml.
Valentin Despa
Intentado esto en un desplegable de autocompletar tengo pero no permite el desplazamiento ni se me permite seleccionar cualquier elemento de la lista
kabuto178
29
TextView se puede envolver en otro diseño (lo acabo de hacer). Para hacer eso, use otro constructor new ArrayAdapter<String>(this, R.layout.a_layout_file, R.id.a_text_view_within_layout, this.file)Vea javadoc paraandroid.widget.ArrayAdapter
Petr Gladkikh
66
No leíste muy bien mi respuesta: cuando usas este constructor : ... (TextView no se puede envolver con otro diseño, como LinearLayout, RelativeLayout, etc.) . Puede envolverse con lo que quiera con la segunda versión del constructor que también tiene una identificación (como mencioné en la segunda parte de mi respuesta).
Luksprog
66
Muchas gracias! Pasé tres horas golpeando mi cabeza contra la pared. Otras referencias decían que solo se podía tener ONE TextView, pero no pude encontrar el requisito tan importante de "TextView no puede estar envuelto por otro diseño, como LinearLayout". Whew, snip snip y funciona de maravilla. ¡Gracias otra véz!
Scott Biggs
31

La sopa está aquí

listitem.xml

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

     <TextView
         android:id="@+id/textview"
         android:layout_width="match_parent"
         android:layout_height="match_parent" >
     </TextView>
</LinearLayout>

Código Java:

 String[] countryArray = {"India", "Pakistan", "USA", "UK"};
 ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.listitem,R.id.textview, countryArray);
 ListView listView = (ListView) findViewById(R.id.listview);
 listView.setAdapter(adapter);
sandeepmaaram
fuente
1
Sé que esto parece una obviedad, pero mirar la documentación de los constructores ArrayAdapter también me ayudó. enlace
luckyging3r
1

Si recibe ese mensaje cuando extiende un ArrayAdapter, obtiene ese error porque no ha proporcionado la identificación de recurso correcta para mostrar el elemento. Llame a la superclase en el constructor y pase la identificación del recurso de TextView:

    //Pass in the resource id:  R.id.text_view
    SpinnerAdapter spinnerAddToListAdapter = new SpinnerAdapter(MyActivity.this,
            R.id.text_view,
            new ArrayList<>());

Adaptador:

public class SpinnerAdapter extends ArrayAdapter<MyEntity> {

    private Context context;
    private List<MyEntity> values;

    public SpinnerAdapter(Context context, int textViewResourceId,
                          List<MyEntity> values) {

        //Pass in the resource id:  R.id.text_view
        super(context, textViewResourceId, values);

        this.context = context;
        this.values = values;
    }
vive el amor
fuente