"ArrayAdapter erfordert, dass die Ressourcen-ID eine TextView ist" xml-Probleme

181

Beim Versuch, meine Ansicht so einzustellen, dass sie ListViewfür die Datei angezeigt wird, die ich anzeigen möchte (Textdatei) , wird eine Fehlermeldung angezeigt. Ich bin mir ziemlich sicher, dass es etwas mit der XML zu tun hat. Ich möchte nur die Informationen von anzeigen this.file = fileop.ReadFileAsList("Installed_packages.txt");. Mein 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
quelle

Antworten:

427

Für den ArrayAdapter muss die Ressourcen-ID eine TextView-XML- Ausnahme sein. Dies bedeutet, dass Sie nicht die ArrayAdaptererwarteten Werte angeben . Wenn Sie diesen Konstruktor verwenden:

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

R.Layout.a_layout_file, die ID eines XML - Layout - Datei muss nur ein enthält TextView(die TextView nicht , kann durch ein anderes Layout gewickelt werden, wie ein LinearLayout, RelativeLayoutetc!), so etwas wie folgt aus :

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

Wenn Sie möchten, dass Ihr Listenzeilenlayout etwas anders ist, verwenden Sie ein einfaches TextViewWidget mit diesem Konstruktor:

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

Hier geben Sie das ideines Layouts an, das verschiedene Ansichten enthalten kann, aber auch ein with und (den dritten Parameter) enthalten muss , das Sie an Ihr übergeben, damit es weiß, wo das Layout in die Zeile eingefügt werden soll.TextViewidArrayAdapterStrings

Luksprog
quelle
2
Hatte das gleiche Problem, weil sich meine Textansicht in einem LinearLayout in der XML-Datei befand.
Valentin Despa
Ich habe es in einem Dropdown-Menü für die automatische Vervollständigung versucht, aber es hat weder das Scrollen noch das Auswählen eines Elements aus der Liste ermöglicht
kabuto178
29
TextView kann in ein anderes Layout eingeschlossen werden (ich habe es gerade getan). Verwenden Sie dazu einen anderen Konstruktor. new ArrayAdapter<String>(this, R.layout.a_layout_file, R.id.a_text_view_within_layout, this.file)Siehe javadoc fürandroid.widget.ArrayAdapter
Petr Gladkikh
6
Sie haben meine Antwort nicht sehr gut gelesen: Wenn Sie diesen Konstruktor verwenden : ... (Die Textansicht kann nicht von einem anderen Layout wie einem LinearLayout, einem RelativeLayout usw. umbrochen werden!) . Mit der zweiten Konstruktorversion, die auch eine ID enthält (wie ich im zweiten Teil meiner Antwort erwähnt habe), kann es nach Belieben umbrochen werden.
Luksprog
6
Ich danke dir sehr! Ich verbrachte drei Stunden damit, meinen Kopf gegen eine Wand zu schlagen. Andere Referenzen besagten, dass Sie nur EINE TextView haben könnten, aber ich konnte die alles entscheidende Anforderung "Die TextView kann nicht von einem anderen Layout wie einem LinearLayout umbrochen werden" nicht finden. Puh, snip snip und es funktioniert wie ein Zauber. Noch einmal Danke!
Scott Biggs
31

Soution ist hier

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>

Java-Code:

 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
quelle
1
Ich weiß, dass dies ein Kinderspiel sein sollte, aber das Lesen der Dokumentation für die ArrayAdapter-Konstruktoren hat mir ebenfalls geholfen. Link
Luckyging3r
1

Wenn Sie diese Meldung erhalten, wenn Sie einen ArrayAdapter erweitern, wird dieser Fehler angezeigt, weil Sie nicht die richtige Ressourcen-ID für die Anzeige des Elements angegeben haben. Rufen Sie die Superklasse im Konstruktor auf und übergeben Sie die Ressourcen-ID der TextView:

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

Adapter:

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;
    }
Live-Liebe
quelle