“ArrayAdapter membutuhkan ID sumber daya untuk menjadi masalah TextView” xml

181

Saya mendapatkan kesalahan saat mencoba mengatur tampilan saya untuk menampilkan ListViewfile yang ingin saya tampilkan (file teks). Saya cukup yakin ini ada hubungannya dengan xml. Saya hanya ingin menampilkan informasi dari this.file = fileop.ReadFileAsList("Installed_packages.txt");. Kode saya:

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
sumber

Jawaban:

428

The ArrayAdapter membutuhkan ID sumber daya menjadi TextView XML pengecualian berarti Anda tidak menyediakan apa yang ArrayAdaptermengharapkan. Ketika Anda menggunakan konstruktor ini:

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

R.Layout.a_layout_fileharus id file tata letak xml yang hanya berisi TextView( TextView tidak dapat dibungkus dengan tata letak lain, seperti LinearLayout, RelativeLayoutdll!), sesuatu seperti ini:

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

Jika Anda ingin tata letak baris daftar Anda menjadi sesuatu yang sedikit berbeda maka TextViewwidget sederhana menggunakan konstruktor ini:

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

tempat Anda menyediakan idtata letak yang dapat berisi berbagai tampilan, tetapi juga harus berisi a TextViewdengan dan id(parameter ketiga) yang Anda berikan ke Anda ArrayAdaptersehingga dapat mengetahui di mana harus meletakkan Stringstata letak baris.

Luksprog
sumber
2
Punya masalah yang sama karena TextView saya ada di dalam LinearLayout di file xml.
Valentin Despa
Sudah mencoba ini pada dropdown autocomplete yang saya miliki, tetapi itu tidak memungkinkan pengguliran atau memungkinkan saya untuk memilih item apa pun dari daftar
kabuto178
29
TextView dapat dibungkus dalam tata letak lain (saya baru saja melakukannya). Untuk melakukannya, gunakan konstruktor lain. new ArrayAdapter<String>(this, R.layout.a_layout_file, R.id.a_text_view_within_layout, this.file)Lihat javadoc untukandroid.widget.ArrayAdapter
Petr Gladkikh
6
Anda tidak membaca jawaban saya dengan sangat baik: Ketika Anda menggunakan konstruktor ini : ... (TextView tidak dapat dibungkus oleh tata letak lain, seperti LinearLayout, RelativeLayout dll!) . Itu dapat dibungkus oleh apa pun yang Anda inginkan dengan versi konstruktor kedua yang juga mengambil id (seperti yang saya sebutkan di bagian kedua dari jawaban saya).
Luksprog
6
Terima kasih banyak! Saya menghabiskan tiga jam memukul kepala saya ke dinding. Referensi lain mengatakan bahwa Anda hanya dapat memiliki ONE TextView, tetapi saya tidak dapat menemukan persyaratan yang sangat penting dari "TextView tidak dapat dibungkus oleh tata letak lain, seperti LinearLayout." Wah, snip snip dan itu berfungsi seperti mantra. Sekali lagi terima kasih!
Scott Biggs
31

Soution ada di sini

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>

Kode 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
sumber
1
Saya tahu ini sepertinya tidak boleh dipikirkan, tetapi melihat dokumentasi untuk konstruktor ArrayAdapter membantu saya juga. tautan
luckyging3r
1

Jika Anda mendapatkan pesan itu ketika Anda memperluas ArrayAdapter, Anda mendapatkan kesalahan itu karena Anda belum memberikan id sumber daya yang benar untuk menampilkan item. Panggil kelas super di konstruktor dan kirimkan id sumber daya dari TextView:

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

Adaptor:

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;
    }
cinta hidup
sumber