"ArrayAdapter nécessite que l'ID de ressource soit un TextView" problèmes XML

182

J'obtiens une erreur en essayant de définir ma vue pour afficher ListViewle fichier que je souhaite afficher (fichier texte). Je suis presque sûr que cela a quelque chose à voir avec le xml. Je veux juste afficher les informations de this.file = fileop.ReadFileAsList("Installed_packages.txt");. Mon code:

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
la source

Réponses:

437

Le ArrayAdapter nécessite l'ID de ressource à un XML TextView moyens d'exception vous ne fournissez pas ce que l' ArrayAdapterattend. Lorsque vous utilisez ce constructeur:

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

R.Layout.a_layout_filedoit être l'identifiant d'un fichier de mise en page xml contenant seulement un TextView(le TextView ne peut pas être enveloppé par une autre mise en page, comme a LinearLayout, RelativeLayoutetc!), quelque chose comme ceci:

<?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 vous voulez que votre disposition de ligne de liste soit quelque chose d'un peu différent, un simple TextViewwidget utilise ce constructeur:

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

où vous fournissez le idd'une mise en page qui peut contenir diverses vues, mais doit également contenir un TextViewavec et id(le troisième paramètre) que vous passez à votre ArrayAdapterafin qu'il puisse savoir où placer le Stringsdans la mise en page de ligne.

utilisateur
la source
2
J'ai eu le même problème car mon TextView était à l'intérieur d'un LinearLayout dans le fichier xml.
Valentin Despa
J'ai essayé cela sur une liste déroulante de saisie semi-automatique que j'ai, mais cela n'a pas permis le défilement ni ne m'a permis de sélectionner un élément de la liste
kabuto178
29
TextView peut être enveloppé dans une autre mise en page (je viens de le faire). Pour ce faire, utilisez un autre constructeur new ArrayAdapter<String>(this, R.layout.a_layout_file, R.id.a_text_view_within_layout, this.file)Voir javadoc pourandroid.widget.ArrayAdapter
Petr Gladkikh
6
Vous n'avez pas très bien lu ma réponse: lorsque vous utilisez ce constructeur : ... (le TextView ne peut pas être enveloppé par une autre disposition, comme un LinearLayout, RelativeLayout etc!) . Il peut être enveloppé par tout ce que vous voulez avec la deuxième version du constructeur qui prend également un identifiant (comme je l'ai mentionné dans la deuxième partie de ma réponse).
utilisateur
6
Merci beaucoup! J'ai passé trois heures à me cogner la tête contre un mur. D'autres références disaient que vous ne pouviez avoir qu'UN SEUL TextView, mais je n'ai pas trouvé l'exigence très importante de "le TextView ne peut pas être enveloppé par une autre disposition, comme un LinearLayout." Ouf, snip snip et ça marche comme un charme. Merci encore!
SMBiggs
33

Soution est là

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>

Code 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
la source
1
Je sais que cela semble être une évidence, mais regarder la documentation des constructeurs ArrayAdapter m'a également aidé. lien
luckyging3r
1

Si vous recevez ce message lorsque vous étendez un ArrayAdapter, vous obtenez cette erreur car vous n'avez pas fourni l'ID de ressource correct pour afficher l'élément. Appelez la super classe dans le constructeur et passez l'ID de ressource de TextView:

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

Adaptateur:

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;
    }
l'amour en direct
la source