Problemas xml "ArrayAdapter requer que o ID do recurso seja um TextView"

181

Estou recebendo um erro ao tentar definir minha exibição para exibir ListViewo arquivo que eu quero exibir (arquivo de texto). Tenho certeza de que tem algo a ver com o xml. Eu só quero exibir as informações de this.file = fileop.ReadFileAsList("Installed_packages.txt");. Meu código:

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
fonte

Respostas:

428

O ArrayAdapter exige que o ID do recurso seja uma exceção XML do TextView significa que você não fornece o que o ArrayAdapteresperado. Quando você usa este construtor:

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

R.Layout.a_layout_filedeve ser o ID de um arquivo de layout xml contendo apenas um TextView( TextView não pode ser envolvido por outro layout, como um LinearLayout, RelativeLayoutetc!), algo como isto:

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

Se você deseja que o layout da linha da sua lista seja um pouco diferente, TextViewuse um construtor simples :

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

onde você fornece o idlayout que pode conter várias visualizações, mas também deve conter um TextViewcom e id(o terceiro parâmetro) que você passa para o seu, ArrayAdapterpara que ele possa saber onde colocá-lo Stringsno layout da linha.

Luksprog
fonte
2
Tive o mesmo problema porque meu TextView estava dentro de um LinearLayout no arquivo xml.
Valentin Despa
Tentou isso em um autocomplete suspensa eu tenho, mas não permitiu a rolagem nem se me permitir selecionar qualquer item da lista
kabuto178
29
O TextView pode ser agrupado em outro layout (acabei de fazer). Para fazer isso, use outro construtor new ArrayAdapter<String>(this, R.layout.a_layout_file, R.id.a_text_view_within_layout, this.file)Veja javadoc paraandroid.widget.ArrayAdapter
Petr Gladkikh 18/04/13
6
Você não leu muito bem minha resposta: Quando você usa esse construtor : ... (o TextView não pode ser quebrado por outro layout, como LinearLayout, RelativeLayout etc!) . Pode ser empacotado com o que você quiser com a segunda versão do construtor que também recebe um ID (como eu mencionei na segunda parte da minha resposta).
precisa saber é o seguinte
6
Muito obrigado! Passei três horas batendo a cabeça contra uma parede. Outras referências diziam que você só podia ter UM TextView, mas não encontrei o requisito importante de "o TextView não pode ser envolvido por outro layout, como um LinearLayout". Uh, snip snip e funciona como um encanto. Mais uma vez, obrigado!
Scott Biggs
31

Soution está aqui

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>

Código 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
fonte
1
Eu sei que isso parece não ser fácil, mas olhar para a documentação dos construtores ArrayAdapter também me ajudou. ligação
luckyging3r
1

Se você estiver recebendo essa mensagem ao estender um ArrayAdapter, está recebendo esse erro porque não forneceu o ID do recurso correto para exibir o item. Chame a superclasse no construtor e transmita a identificação do recurso do TextView:

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

Adaptador:

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;
    }
amor ao vivo
fonte