“ArrayAdapter kaynak kimliğinin TextView olmasını gerektirir” xml sorunları


181

Görüntülemek ListViewistediğim dosyayı (metin dosyası) görüntüleyecek şekilde ayarlamaya çalışırken bir hata alıyorum . Ben xml ile ilgili bir şey olduğundan eminim. Sadece bilgisini görüntülemek istiyorum this.file = fileop.ReadFileAsList("Installed_packages.txt");. Kodum:

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>

Yanıtlar:


429

ArrayAdapter bir TextView'un XML olmasını kaynak kimliği gerektirir ne girmezseniz istisna aracı ArrayAdapterbekliyor. Bu yapıcıyı kullandığınızda:

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

R.Layout.a_layout_fileSadece içeren bir xml düzenini dosyasının kimliği olmalıdır TextView( TextView olamaz bir gibi başka düzen tarafından sarılacak LinearLayout, RelativeLayoutböyle! vs.), bir şey:

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

Liste satırı düzeninizin biraz farklı bir şey olmasını istiyorsanız, basit bir TextViewwidget bu yapıcıyı kullanın:

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

Eğer tedarik nerede idayrıca çeşitli görünümleri içerebilir, ancak bir düzen olmalıdır işaretini içerir TextViewve idaşağıdaki konularda geçmek olduğunu (üçüncü parametre) ArrayAdaptero nereye koyacağını bilemez böylece Stringssatır düzeninde.


2
Benim TextView xml dosyasında bir LinearLayout içinde olduğu için aynı sorun vardı.
Valentin Despa

Sahip olduğum bir otomatik tamamlama açılır listesinde denedim ama kaydırmaya izin vermedi veya listeden herhangi bir öğeyi
seçmeme

29
TextView'un olabilir (Sadece yaptım) diğer düzende sarılacak. Bunu yapmak için diğer new ArrayAdapter<String>(this, R.layout.a_layout_file, R.id.a_text_view_within_layout, this.file)android.widget.ArrayAdapter
yapıcıyı

6
Çok iyi cevabımı okumadım: kullandığınızda bu kurucu : ... (TextView'un olamaz ! Bir LinearLayout, RelativeLayout vb gibi başka bir düzen tarafından sarılacak) . Bir kimlik alan ikinci yapıcı sürümü ile istediğiniz her şey tarafından sarılabilir (cevabımın ikinci bölümünde bahsettiğim gibi).
Luksprog

6
Çok teşekkür ederim! Üç saatimi kafamı duvara çarptırarak geçirdim. Diğer referanslar, yalnızca bir TextView olabilir, ancak "TextView, LinearLayout gibi başka bir düzen tarafından sarılmış olamaz" tüm önemli gereksinimi bulamadık dedi. Vay be, snip snip ve bir cazibe gibi çalışıyor. Tekrar, teşekkürler!
Scott Biggs

31

Dikkat burada

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 kodu:

 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
Bunun bir beyin gibi olmaması gerektiğini biliyorum, ancak ArrayAdapter kurucuları için belgelere bakmak da bana yardımcı oldu. bağlantı
luckyging3r

1

Bir ArrayAdapter genişletirken bu iletiyi alıyorsanız, öğeyi görüntülemek için doğru kaynak kimliğini sağlamadığınız için bu hatayı alıyorsunuz. Yapıcıdaki süper sınıfı çağırın ve TextView'in kaynak kimliğini iletin:

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

Adaptör:

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;
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.