Autore Topic: Problema esercizio [ListActivity] RISOLTO!  (Letto 701 volte)

Offline Andrea Di Lello

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Win 7
Problema esercizio [ListActivity] RISOLTO!
« il: 05 Settembre 2013, 12:30:05 CEST »
0
Ciao a tutti

sto studiando come usare correttamente AsyncTask su un libro in pdf di Commonsware, ma non ho il pdf con gli esercizi completi quindi ho un problema nella stesura in xml del layout

il codice della listActivity è il seguente :
Codice (XML): [Seleziona]
package com.example.asyncdemo;

import android.os.Bundle;
import android.os.SystemClock;
import android.os.AsyncTask;
import android.app.ListActivity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import java.util.ArrayList;

public class AsyncDemo extends ListActivity {
       
        private static final String[] items = {"lorem","ipsum","dolor","sit",
                "amet","consectetuer","adipiscing","elit","morbi","vel","ligula","vitae",
                "arcu","aliquet","mollis","etiam","vel","erat","placerat","ante",
                "porttitor","sodales","pellentesque","augue","purus"};

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_async_demo);
               
                setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList()));
                new AddStringTask().execute();
        }
       
        class AddStringTask extends AsyncTask<Void, String, Void>{
               
                @Override
                protected Void doInBackground(Void... unused) {
                        for(String item : items){
                                publishProgress(item);
                                SystemClock.sleep(200);
                        }
                        return null;
                }
                       
                @Override
                protected void onProgressUpdate(String... item){
                        ((ArrayAdapter)getListAdapter()).add(item[0]);
                }
               
                @Override
                protected void onPostExecute(Void unused){
                        Toast
                                .makeText(AsyncDemo.this,  "Fatto!", Toast.LENGTH_SHORT)
                                .show();
                }
        }
}

il problema è che non ho il file xml del layout quindi scriverlo a solo, ho provato così:

Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context=".AsyncDemo" >

    <TextView
   android:id="@android:id/text1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:textAppearance="?android:attr/textAppearanceListItemSmall"
   android:gravity="center_vertical"
   android:paddingStart="?android:attr/listPreferredItemPaddingStart"
   android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
   android:minHeight="?android:attr/listPreferredItemHeightSmall" />

    <ListView
       android:id="@+id/simple_list_item_1"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_alignLeft="@android:id/text1"
       android:layout_below="@android:id/text1"
       android:layout_marginLeft="88dp"
       android:layout_marginTop="76dp" >
    </ListView>

</RelativeLayout>

quando lo provo ricevo il seguente errore:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.asyncdemo/com.example.asyncdemo.AsyncDemo}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'

immagino che il problema sia il layout non ben formato in relazione con la ListActivity

Avete qualche suggerimento?

Read you soon

Andrea


« Ultima modifica: 09 Settembre 2013, 11:39:50 CEST da Andrea Di Lello »

Offline gabric

  • Utente senior
  • ****
  • Post: 615
  • Respect: +18
    • Google+
    • Mostra profilo
    • Brancato's site
  • Dispositivo Android:
    Nexus 5 / Tablet mediacom s4
  • Play Store ID:
    Brancato's+app
  • Sistema operativo:
    window7. ubuntu
Re:Problema esercizio [ListActivity]
« Risposta #1 il: 05 Settembre 2013, 12:44:32 CEST »
+1
cambia
@+id/simple_list_item_1
@+id/list
« Ultima modifica: 05 Settembre 2013, 12:47:14 CEST da gabric »

Offline Andrea Di Lello

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Win 7
Re:Problema esercizio [ListActivity]
« Risposta #2 il: 05 Settembre 2013, 12:57:09 CEST »
0
cambia
@+id/simple_list_item_1
@+id/list

ok provo, infatti quello è l'id classico del listview, quello che ho trovato nell'esempio non mi risultava appartenere ad alcun widget che avevo usato finora... grazie!

Offline gabric

  • Utente senior
  • ****
  • Post: 615
  • Respect: +18
    • Google+
    • Mostra profilo
    • Brancato's site
  • Dispositivo Android:
    Nexus 5 / Tablet mediacom s4
  • Play Store ID:
    Brancato's+app
  • Sistema operativo:
    window7. ubuntu
Re:Problema esercizio [ListActivity]
« Risposta #3 il: 05 Settembre 2013, 12:58:58 CEST »
0
dopo che modifichi il file xml salva, altrimenti il compilatore non rigenera il file r.id e non trovi l'id dell'oggetto

Offline Andrea Di Lello

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Win 7
Re:Problema esercizio [ListActivity]
« Risposta #4 il: 06 Settembre 2013, 16:59:16 CEST »
0
allora, ho trovato su GitHub l'intero progetto di questo esercizio relativo al libro di Commonsware


( https://github.com/commonsguy/cw-android/tree/master/Threads )

l'ultimo update è relativo a 2 anni fa, quindi deduco che è stata usata un API relativa a quel periodo, questo potrebbe incidere visto che ho aggiornato Eclipse e sto usando API 18: Android 4.3

Comunque li nel sito ci sono tutti file relativi al progetto compreso il layout.xml, ora ogni volta che si crea un nuovo progetto questo automaticamente ti fa creare la app a partire da un RelativeLayout (tra l'altro mi è stato detto che non è possibile fare altrimenti ... ) sul quale appoggi tutti gli widget che vuoi

se notate nel layout.xml del progetto invece si parte direttamente dal componente ListView, il cui tag contiene anche:
xmlns:android="http://schemas.android.com/apk/res/android" che di solito trovo appunto in cima al tag del RelativeLayout che contiene poi tutto ciò che ci metto sopra

ho semplicemente provato a rifarlo uguale, invece di scaricare l'intero progetto (cancellando il tag del RelativeLayout) ed al lancio dell'applicazione su un emulatore ricevo ancora:

E/AndroidRuntime(1159): FATAL EXCEPTION: main
E/AndroidRuntime(1159): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.asyncdemo/com.example.asyncdemo.AsyncDemo}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'


credevo di aver intuito il suggerimento di gabric: ogni componente grafico che si aggiunge ha un suo id e per utilizzarlo, va specificato nel file .java dell'activity invece, nel progetto si usa l'id "simple_list_item_1"


c'è probabilmente qualcosa che mi sfugge oppure ho qualche lacuna O_o


Read you soon


Andrea

Offline gabric

  • Utente senior
  • ****
  • Post: 615
  • Respect: +18
    • Google+
    • Mostra profilo
    • Brancato's site
  • Dispositivo Android:
    Nexus 5 / Tablet mediacom s4
  • Play Store ID:
    Brancato's+app
  • Sistema operativo:
    window7. ubuntu
Re:Problema esercizio [ListActivity]
« Risposta #5 il: 06 Settembre 2013, 17:03:05 CEST »
+1
nel codice quando scrivi r.id.list ti genera un errore? (prima di compilare)
comunque se metti tutti i codici, classe e layout vedo di sistemare tutto

Offline Andrea Di Lello

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Win 7
Re:Problema esercizio [ListActivity]
« Risposta #6 il: 06 Settembre 2013, 17:34:19 CEST »
0
nel codice quando scrivi r.id.list ti genera un errore? (prima di compilare)
comunque se metti tutti i codici, classe e layout vedo di sistemare tutto

dunque, ora che mi ci fai riflettere nel file .java della ListActivity che ho messo in cima, non ci sono riferimenti all'id del componente ListView android:id="@+id/list"

infatti mi riferivo (mi sa proprio che mi ero confuso!) a questa riga di codice:

Codice (XML): [Seleziona]
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList()));
                new AddStringTask().execute();

si parla in effetti del secondo parametro di ArrayAdapter<String>

nel primo messaggio del post ho messo il codice della classe java e il codice di layout della app che avevo provato a fare da solo a partire da quello pregenerato ora l'ho cambiato con quello che ho trovato nel progetto su GitHub
( https://github.com/commonsguy/cw-android/blob/master/Threads/Asyncer/res/layout/main.xml )

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<ListView
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@android:id/list"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:drawSelectorOnTop="false"
/>

se ti serve altro da guardare fammi sapere

P.S.: ora devo staccare eventualmente cerco di ricollagermi stasera se posso, grazie ancora del supporto, ovviamente senza impegno ;)
« Ultima modifica: 06 Settembre 2013, 17:37:38 CEST da Andrea Di Lello »

Offline gabric

  • Utente senior
  • ****
  • Post: 615
  • Respect: +18
    • Google+
    • Mostra profilo
    • Brancato's site
  • Dispositivo Android:
    Nexus 5 / Tablet mediacom s4
  • Play Store ID:
    Brancato's+app
  • Sistema operativo:
    window7. ubuntu
Re:Problema esercizio [ListActivity]
« Risposta #7 il: 06 Settembre 2013, 17:38:36 CEST »
+1
allora facciamo un pò di chiarezza
android.R.layout.simple_list_item_1
dovrebbe indicare un layout chiamato simple_list_item_1 che è nativo di android
al nome, non deve contenere la lista, ma il singolo elemento della lista (considera che ogni rifa deve far riferimento ad un layout)
mentre r.id.list è l'id dell'elemento della lista contenuto dentro il file del layout.
qui sul forum c'è un esempio su come creare una list view con un simple custom adapter, a me ha chiarito molti dubbi
« Ultima modifica: 06 Settembre 2013, 17:40:28 CEST da gabric »

Offline Andrea Di Lello

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Win 7
Re:Problema esercizio [ListActivity]
« Risposta #8 il: 09 Settembre 2013, 09:08:49 CEST »
0
ok intanto guardo la guida grazie

EDIT: cmq devo dare per scontato che il codice di questo esercizio messo su internet è incompleto giusto?
in effetti l'unico modo che conoscevo per utilizzare i vari widgets inseriti nel layout (graficamente o tramite codice xml) era dichiararli, inizializzarli e indicare al compilatore il componente tramite l'istruzione tipo:

lista = (ListView) findViewById(R.id.list);



Post unito: 09 Settembre 2013, 11:54:31 CEST
[RISOLUZIONE]


a volte leggo con superficialità (povero me!), sono tornato quindi a rileggere una pagina di StackOverflow nella quale si chiedeva aiuto riguardo lo stesso errore che ricevevo io nel mio esercizio su AsyncTask

http://stackoverflow.com/questions/11050817/your-content-must-have-a-listview-whose-id-attribute-is-android-r-id-list/18695385#18695385


la risposta più quotata è la seguente:


Citazione
Rename the id of your ListView like this,[/size]<ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent"/>Since you are using ListActivity your xml file must specify the keyword android while mentioning to a ID.[/font][/font][/size]

Applicata la modifica l'esempio funziona correttamente su emulatore
Spero sia utile anche ad altri
Saluti
Andrea
« Ultima modifica: 09 Settembre 2013, 11:54:31 CEST da Andrea Di Lello, Reason: Merged DoublePost »