„ArrayAdapter wymaga, aby identyfikator zasobu był TextView” xml problemy

181

Podczas próby ustawienia widoku do wyświetlenia pojawia się błąd ListViewdla pliku, który chcę wyświetlić (plik tekstowy). Jestem pewien, że ma to coś wspólnego z xml. Chcę tylko wyświetlić informacje z this.file = fileop.ReadFileAsList("Installed_packages.txt");. Mój kod:

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
źródło

Odpowiedzi:

428

ArrayAdapter wymaga identyfikatora zasobów do być TextView XML wyjątek oznacza, że nie dostarczają jaka ArrayAdapteroczekuje. Podczas korzystania z tego konstruktora:

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

R.Layout.a_layout_filemusi mieć identyfikator pliku XML szablonu zawierającego tylko TextView(the TextView nie może być owinięty w innym układzie, jak LinearLayout, RelativeLayoutitp!) coś takiego:

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

Jeśli chcesz, aby układ wiersza listy był nieco inny, TextViewużyj prostego widgetu za pomocą tego konstruktora:

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

gdzie dostarczasz id układ, który może zawierać różne widoki, ale także musi zawierać znak „ TextViewi” id(trzeci parametr), który przekazujesz swojemu, ArrayAdapteraby wiedział, gdzie umieścić Stringsukład wiersza.

Luksprog
źródło
2
Miałem ten sam problem, ponieważ mój TextView był wewnątrz LinearLayout w pliku xml.
Valentin Despa
Próbowałem tego na liście autouzupełniania, którą mam, ale nie pozwoliło to na przewijanie, ani nie pozwoliło mi wybrać żadnego elementu z listy
kabuto178
29
TextView można zawinąć w inny układ (właśnie to zrobiłem). Aby to zrobić, użyj innego konstruktora new ArrayAdapter<String>(this, R.layout.a_layout_file, R.id.a_text_view_within_layout, this.file)Zobacz javadoc dlaandroid.widget.ArrayAdapter
Petr Gladkikh 18.04.13
6
Nie przeczytałeś mojej odpowiedzi bardzo dobrze: kiedy używasz tego konstruktora : ... (TextView nie może być zawinięty przez inny układ, taki jak LinearLayout, RelativeLayout itp!) . Może być zawinięty w cokolwiek zechcesz z drugą wersją konstruktora, która również przyjmuje identyfikator (jak wspomniałem w drugiej części mojej odpowiedzi).
Luksprog,
6
Dziękuję bardzo! Spędziłem trzy godziny waląc głową w ścianę. Inne odniesienia mówiły, że mógłbyś mieć tylko JEDEN TextView, ale nie mogłem znaleźć najważniejszego wymogu „TextView nie może być zawinięty przez inny układ, taki jak LinearLayout”. Uff, snip snip i działa jak urok. Jeszcze raz dzięki!
Scott Biggs,
31

Soution jest tutaj

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>

Kod 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
źródło
1
Wiem, że wydaje się, że nie powinno to być kłopotliwe, ale pomogło mi również przejrzenie dokumentacji konstruktorów ArrayAdapter. link
luckyging3r
1

Jeśli ten komunikat pojawia się podczas rozszerzania ArrayAdapter, pojawia się ten błąd, ponieważ nie podałeś poprawnego identyfikatora zasobu do wyświetlenia elementu. Wywołaj superklasę w konstruktorze i przekaż identyfikator zasobu 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;
    }
żywa miłość
źródło