Autore Topic: problema creare adapter personalizzato  (Letto 1084 volte)

Offline Ansem

  • Utente junior
  • **
  • Post: 107
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC HD2
  • Sistema operativo:
    4.0.4
problema creare adapter personalizzato
« il: 18 Maggio 2012, 15:53:39 CEST »
0
Raga io devo creare una listview con 3 textview e basta,però non riesco a capire bene come debba fare. Su internet ho trovato un tutorial,e su di esso ho creato questo adpter:
Codice: [Seleziona]
public class MySimpleArrayAdapter extends ArrayAdapter<String> {
        private final String[] targa;
        private final String[] ora;
        private final String[] costo;
        private Context context;
       
        public MySimpleArrayAdapter(Context context, String[] targa,String[] ora,String[] costo) {
                super(context,[b] R.layout.rowlayout[/b], targa);
                this.context = context;
                this.targa = targa;
                this.ora = ora;
                this.costo = costo;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                LayoutInflater inflater = (LayoutInflater) context
                                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View rowView = inflater.inflate(R.layout.rowlayout, parent, false);
                TextView textView = (TextView) rowView.findViewById(R.id.label);
                textView.setText(values[position]);
                // Change the icon for Windows and iPhone
                String s = values[position];
               
                return rowView;
        }
}
però ci sono alcune cose che non ho chiare:
cosa dovrebbe essere  R.layout.rowlayout? devo per caso creare un file XML esterno con scritto dome dovrebbe essere l'elemento della listview?
Nel caso serva un file XML,seguendo la guida di questo forum ho creato questo:
Codice: [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
   
         <!-- TEXT OF FEED -->
         
         <TextView
            android:id="@+id/txtId"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Numero macchina: #"
            android:textAppearance="?android:attr/textAppearanceMedium" />
         
          <TextView
            android:id="@+id/txtTarga"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Targa: #"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/txtOra"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Ora ingresso: #"
            android:textAppearance="?android:attr/textAppearanceMedium" />


        <TextView
            android:id="@+id/txtCosto"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Prezzo uscita: #"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:lines="1"
            />
</LinearLayout>
come dovrei fare per renderlo compatibile con il mio adapter?
« Ultima modifica: 18 Maggio 2012, 16:08:27 CEST da Ansem »

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:problema creare adapter personalizzato
« Risposta #1 il: 18 Maggio 2012, 16:10:12 CEST »
+1
Allora, come prima cosa devi definire una listview nella tua activity. Come seconda cosa devi definire una riga (row) in un xml, che sarebbe una riga della listview. Nel costruttore devi passargli la listview, mentre nel metodo getView() devi passargli la singola riga.xml

No scusa ho scritto na cagata. Dammi un secondo e ti posto del codice.

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:problema creare adapter personalizzato
« Risposta #2 il: 18 Maggio 2012, 16:21:24 CEST »
+1
Allora, il  tutto dipende se usi una Activity o una ListActivity. Se usi una listActivity, nel layout.XML devi avere una listview con id android:id="@android:id/list". Nel tuo adapter poi non devi passargli il layout, ma solo il XML della singola riga.

Mio layout:
Codice (XML): [Seleziona]
<?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">
        <TextView android:id="@+id/path" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:textSize="17sp"/>
        <ListView android:id="@android:id/list" android:layout_width="fill_parent"
                android:layout_height="wrap_content" />
        <TextView android:id="@android:id/empty" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:text="- No data" />
</LinearLayout>

Mia singola riga:
Codice (XML): [Seleziona]
<?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="wrap_content"
        android:orientation="horizontal">
        <LinearLayout android:layout_width="wrap_content"
                android:id="@+id/linearLayout1" android:layout_height="match_parent"
                android:orientation="horizontal" android:gravity="center">
                <ImageView android:src="@drawable/folder"
                        android:layout_width="wrap_content" android:layout_height="wrap_content"
                        android:id="@+id/fileimage"></ImageView>
                <TextView android:id="@+id/singlerow" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
        </LinearLayout>
</LinearLayout>

Parte dell'activity:
Codice (Java): [Seleziona]
@Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.folderbrowser);
                myPath = (TextView) findViewById(R.id.path);
                this.defaultPath = "/"
                                + Environment.getExternalStorageDirectory().getName();
                DatabaseManager db = new DatabaseManager(this);
                db.connect();
                String savedPath = db.getSharedFolder();
                db.disconnect();
                getDir(savedPath);
                registerForContextMenu(getListView());
        }

        private void getDir(String dirPath) {
                ......
                ArrayAdapterFolderBrowser fileList = new ArrayAdapterFolderBrowser(
                                getApplicationContext(), item, path);
                setListAdapter(fileList);
        }

Parte dell'adapter:
Codice (Java): [Seleziona]
public ArrayAdapterFolderBrowser(Context context, List<String> values,
                        List<String> path) {
                super(context, R.layout.folderbrowser_row, values);
                this.context = context;
                this.values = values;
                this.path = path;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                LayoutInflater inflater = (LayoutInflater) context
                                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View rowView = inflater.inflate(R.layout.folderbrowser_row, parent,
                                false);
                TextView textView = (TextView) rowView.findViewById(R.id.singlerow);
                ImageView imageView = (ImageView) rowView.findViewById(R.id.fileimage);
                textView.setText(values.get(position));
                ...
        }

Offline Ansem

  • Utente junior
  • **
  • Post: 107
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC HD2
  • Sistema operativo:
    4.0.4
Re:problema creare adapter personalizzato
« Risposta #3 il: 22 Maggio 2012, 12:21:13 CEST »
0
mi scuso per rispondere solo ora
allora io sto usando una activity normale. Il codice del layolt è questo:
Codice: [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:orientation="vertical" >




    <TextView
        android:id="@+id/textView1"
        android:layout_width="192dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginBottom="20dp"
        android:text="Grazie per aver parcheggiato da noi!"
        android:textAppearance="?android:attr/textAppearanceMedium" />

   <ListView
        android:id="@+id/mylist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>
       

    <Button
        android:id="@+id/btnEsci"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Torna a scelta" />

</LinearLayout>

questo è quello della singola riga: (single_feed)
Codice: [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
   
         <!-- TEXT OF FEED -->
         
         <TextView
            android:id="@+id/txtId"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Numero macchina: #"
            android:textAppearance="?android:attr/textAppearanceMedium" />
         
          <TextView
            android:id="@+id/txtTarga"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Targa: #"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/txtOra"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Ora ingresso: #"
            android:textAppearance="?android:attr/textAppearanceMedium" />


        <TextView
            android:id="@+id/txtCosto"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Prezzo uscita: #"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:lines="1"
            />
</LinearLayout>

E questo è il mio adapter (da sistemare)
Codice: [Seleziona]
public class MioAdapter extends ArrayAdapter<String> {
        private final Context context;
        private final String[] values;

        public MioAdapter(Context context, String[] values) {
                super(context, R.layout.single_feed, values);
                this.context = context;
                this.values = values;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                LayoutInflater inflater = (LayoutInflater) context
                                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View rowView = inflater.inflate(R.layout.single_feed, parent, false);
                TextView textView = (TextView) rowView.findViewById(R.id.label);
                textView.setText(values[position]);
                // Change the icon for Windows and iPhone
               

                return rowView;
        }
}

infinite il codice dell'activity vera e propria:
Codice: [Seleziona]
public class checkout extends Activity{
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                //apro la view
                super.onCreate(savedInstanceState);
                setContentView(R.layout.checkout);
               
                //gestsco l'adapter per creare la lista
                public void onCreate(Bundle icicle) {
                        super.onCreate(icicle);
                        String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                                        "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                                        "Linux", "OS/2" };
                        MioAdapter adapter = new MioAdapter(this, values);
                        setListAdapter(adapter);
                };
               

allora il mio scopo è avere 4 textview e basta,non mi interessano immagini.
Non riesco a capire bene come devo modificare il mio adapter,e come poi implementarlo correttamente nell'activity principale

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:problema creare adapter personalizzato
« Risposta #4 il: 22 Maggio 2012, 17:20:30 CEST »
+1
Se non usi ListActivity ti complichi la vita. Estendi ListActivity e modifica l'id della lista del layout.

Il codice sotto dovrebbe essere giusto. Che problema hai?

Codice (Java): [Seleziona]
 @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                LayoutInflater inflater = (LayoutInflater) context
                                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View rowView = inflater.inflate(R.layout.single_feed, parent, false);
                TextView textView = (TextView) rowView.findViewById(R.id.label);
                textView.setText(values[position]);
                // Change the icon for Windows and iPhone
               

                return rowView;
        }

Offline Ansem

  • Utente junior
  • **
  • Post: 107
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC HD2
  • Sistema operativo:
    4.0.4
Re:problema creare adapter personalizzato
« Risposta #5 il: 23 Maggio 2012, 16:44:43 CEST »
0
Se non usi ListActivity ti complichi la vita. Estendi ListActivity e modifica l'id della lista del layout.

Il codice sotto dovrebbe essere giusto. Che problema hai?

Codice (Java): [Seleziona]
 @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                LayoutInflater inflater = (LayoutInflater) context
                                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View rowView = inflater.inflate(R.layout.single_feed, parent, false);
                TextView textView = (TextView) rowView.findViewById(R.id.label);
                textView.setText(values[position]);
                // Change the icon for Windows and iPhone
               

                return rowView;
        }
allora, io avrrò un array dove avrò la risposta ad un post.
Gli elementi di questo array andranno in campi diversi della riga:
1° el:targa-->txtTarga
2° el:ora-->txtOra
3°el:costo-->txtCosto

io come faccio a fare questa operazione?non parlo del ciclo ma proprio dell'assegnazione,perchè da quel codice non capisco che modo possa dire quali textview debbano prendere i rispettivi campi

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:problema creare adapter personalizzato
« Risposta #6 il: 23 Maggio 2012, 19:12:30 CEST »
+1
Codice (Java): [Seleziona]
public class MySimpleArrayAdapter extends ArrayAdapter<String> {
        private final String[] targa;
        private final String[] ora;
        private final String[] costo;
        private Context context;
       
        public MySimpleArrayAdapter(Context context, String[] targa,String[] ora,String[] costo) {
                super(context, R.layout.rowlayout, targa);
                this.context = context;
                this.targa = targa;
                this.ora = ora;
                this.costo = costo;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                LayoutInflater inflater = (LayoutInflater) context
                                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View rowView = inflater.inflate(R.layout.rowlayout, parent, false);

                //prima view
                TextView textViewCosto = (TextView) rowView.findViewById(R.id.txtCosto);
                textViewCosto.setText(costo[position]);

                //seconda view
                TextView textViewTarga = (TextView) rowView.findViewById(R.id.txtTarga);
                textViewTarga.setText(targa[position]);

                //terza view
                TextView textViewOra = (TextView) rowView.findViewById(R.id.txtOra);
                textViewOra.setText(ora[position]);
               
                return rowView;
        }
}

Questo sarebbe il codice dell'adapter. Dico SAREBBE perchè non posso testare per vedere se funziona.
Spiegazione: Tu ad un adapter tramite il costruttore, passi tutti i ruoi parametri e li salvi nelle variabili di classe, come appunto già fati. Nel metodo getView() devi definire la tua riga, cioè popolare la riga.xml con i dati che gli hai passato. Nella riga.xml hai vari campi, nel tuo caso le 3 textview, che richiami con findViewBy() e passando l'id definito del xml stesso (vedi codice sopra). Una volta che hai la view ci fai quello che vuoi, nel mio codice ci setto i valori delle varie array in base alla position.

Spero sia più chiaro.
Consiglio: non usare MAI array primitive (a parte qualche rara eccezione), cerca alternative come ArrayList o Vector....ti renderà la vita più facile in futuro.

Offline Ansem

  • Utente junior
  • **
  • Post: 107
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC HD2
  • Sistema operativo:
    4.0.4
Re:problema creare adapter personalizzato
« Risposta #7 il: 24 Maggio 2012, 12:11:01 CEST »
0
alla fine ho deciso che farò in maniera più semplice,utilizzando il simple_list_item 1 e visualizzando poi le informazioni dopo.
purtroppo ho poco tempo,in quanto questa è la mia tesina,e devo fare anche altre cose. Grazie mille comunque per l'aiuto!
« Ultima modifica: 24 Maggio 2012, 12:34:24 CEST da Ansem »