"XML ArrayAdapter richiede che l'ID risorsa sia un oggetto TextView"


181

Ricevo un errore quando provo a impostare la vista per visualizzare ListViewil file che voglio visualizzare (file di testo). Sono abbastanza sicuro che abbia qualcosa a che fare con l'xml. Voglio solo visualizzare le informazioni da this.file = fileop.ReadFileAsList("Installed_packages.txt");. Il mio codice:

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>

Risposte:


428

L'ArrayAdapter richiede l'ID di risorsa di essere un TextView XML mezzo di eccezione non si fornisce ciò che ArrayAdapterl'aspetta. Quando usi questo costruttore:

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

R.Layout.a_layout_filedeve essere l'id di un file di layout XML contenente solo un TextView( TextView non può essere racchiuso da un altro layout, come un LinearLayout, RelativeLayoutecc!), qualcosa del genere:

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

Se vuoi che il layout della tua lista sia un po 'diverso, un semplice TextViewwidget usa questo costruttore:

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

dove si fornisce il iddi un layout che può contenere varie viste, ma deve anche contenere un TextViewcon e id(il terzo parametro) che si passa al proprio in ArrayAdaptermodo che possa sapere dove inserire il Stringslayout di riga.


2
Ho avuto lo stesso problema perché il mio TextView era all'interno di un LinearLayout nel file XML.
Valentin Despa,

Ho provato questo su un menu a discesa con completamento automatico che ho ma non ha permesso lo scorrimento né mi ha permesso di selezionare qualsiasi elemento dall'elenco
kabuto178

29
TextView può essere avvolto in altri layout (l'ho appena fatto). Per farlo usa un altro costruttore new ArrayAdapter<String>(this, R.layout.a_layout_file, R.id.a_text_view_within_layout, this.file)Vedi javadoc perandroid.widget.ArrayAdapter
Petr Gladkikh il

6
Non hai letto molto bene la mia risposta: quando usi questo costruttore : ... (TextView non può essere racchiuso in un altro layout, come LinearLayout, RelativeLayout ecc!) . Può essere racchiuso da qualsiasi cosa tu voglia con la seconda versione del costruttore che prende anche un id (come ho detto nella seconda parte della mia risposta).
Luksprog,

6
Grazie mille! Ho trascorso tre ore a battere la testa contro un muro. Altri riferimenti hanno affermato che potresti avere UN SOLO TextView, ma non sono riuscito a trovare l'importantissimo requisito di "TextView non può essere avvolto da un altro layout, come un LinearLayout". Accidenti, cecchino e funziona come un incantesimo. Grazie ancora!
Scott Biggs,

31

Soution è qui

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>

Codice 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);

1
So che sembra che dovrebbe essere un gioco da ragazzi, ma guardare la documentazione per i costruttori di ArrayAdapter mi ha aiutato anche. link
luckyging3r

1

Se ricevi questo messaggio quando estendi un ArrayAdapter, ricevi questo errore perché non hai fornito l'ID risorsa corretto per visualizzare l'elemento. Chiama la superclasse nel costruttore e passa l'ID risorsa di TextView:

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

Adattatore:

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;
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.