Autore Topic: Limiti della listView e dell'Array adapter  (Letto 629 volte)

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Limiti della listView e dell'Array adapter
« il: 04 Dicembre 2014, 16:44:52 CET »
0
Salve a tutti!

Io nella mia lista di elementi ogni riga ha due TextView, una riporta un nome e l'altra una distanza.
Per popolare tale lista io usa una ListView ed un ArrayAdapter ma ciò mi permette di modificare secondo le mie esigenze solo la TextView dei nomi.
C'é un modo di modificare contemporaneamente ed in modo dinamico anche la TextView della distanza?


Spero di essermi spiegato bene, nel caso posto il codice xml e java.

Grazie mille in anticipo!

iClaude

  • Visitatore
Re:Limiti della listView e dell'Array adapter
« Risposta #1 il: 05 Dicembre 2014, 10:24:58 CET »
0
È sicuramente possibile.
Posta il codice dell'adapter.

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Limiti della listView e dell'Array adapter
« Risposta #2 il: 05 Dicembre 2014, 12:54:01 CET »
0
questo è il codice che uso per popolare la lista:
Codice (Java): [Seleziona]
public class Alberghi extends Activity {

    ListView listView;
    ImageButton back;
    // Defined Array values to show in ListView
    String[] values = new String[]{"Agriturismo Da Redeo","Agriturismo Airone Blu",
            "Az.Agricola Il Filare","Albergo-Ristorante Il capriolo","Albergo-Ristorante Chalet Pineta",
            "B&B Ai Quattro Gatti","B&B Agriturismo Petrarosa","B&B Lino, Libri e Rose",
            "B&B Il Borgo","B&B La Rupe","B&B Case Mazza", "B&B Sommariva",
            "Castagneto","La Corte Bonomini", "B&B Mandala"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.alberghi);

        // Get ListView object from xml
        listView = (ListView) findViewById(R.id.listView);
        back=(ImageButton) findViewById(R.id.Back);

        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });



        // Define a new Adapter
        // First parameter - Context
        // Second parameter - Layout for the row
        // Third parameter - ID of the TextView to which the data is written
        // Forth - the Array of data

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.rowalberghi,
                R.id.Nome, values);

        // Assign adapter to ListView
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                // ListView Clicked item index
                int itemPosition     = position;

                // ListView Clicked item value
                String  itemValue    = (String) listView.getItemAtPosition(position);

                Intent SingleAlbergo = new Intent(Alberghi.this,Albergo.class);
                SingleAlbergo.putExtra("Nome",itemValue);
                startActivity(SingleAlbergo);


            }
        });
    }

iClaude

  • Visitatore
Re:Limiti della listView e dell'Array adapter
« Risposta #3 il: 05 Dicembre 2014, 21:14:51 CET »
+1
Nel tuo esempio hai usato un ArrayAdapter normale.
Dovresti creare un ArrayAdapter personalizzato che estende ArrayAdapter e passargli una lista di oggetti contenenti le informazioni richieste. In pratica il classico modello del ViewHolder, getView, ecc. ecc.

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Limiti della listView e dell'Array adapter
« Risposta #4 il: 05 Dicembre 2014, 21:35:31 CET »
0
Ok ora guardo qualche tutorial sull'argomento e vedo cosa riesco a fare

grazie mille comunque

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Limiti della listView e dell'Array adapter
« Risposta #5 il: 09 Dicembre 2014, 10:19:33 CET »
0
Eccomi tornato dopo qualche ricerca ^^

Su questo forum ho trovato questo turial : [medio] ListView con layout personalizzato tramite un SimpleAdapter - Android Developers Italia

anche se dopo un po mi sono perso e ora me lo devo studiare veramente bene >_<

cosa ne pensate? potrebbe fare al caso mio o avete consigli per un codice migliore?

iClaude

  • Visitatore
Re:Limiti della listView e dell'Array adapter
« Risposta #6 il: 09 Dicembre 2014, 10:41:19 CET »
0
Il mio consiglio è quello di utilizzare il pattern viewholder, anche perché lo troverai praticamente ovunque:
Android ViewHolder Pattern Example | Java Code Geeks

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Limiti della listView e dell'Array adapter
« Risposta #7 il: 09 Dicembre 2014, 11:22:22 CET »
0
Ti ringrazio tantissimo per il turorial ^^ ad una prima occhiata posso dire di aver capito buona parte del codice, l'unica cosa che non ho capito è dove va inserita la classe getView().... va inserita nell'ArrayAdapterItem.java o nel main?

iClaude

  • Visitatore
Re:Limiti della listView e dell'Array adapter
« Risposta #8 il: 09 Dicembre 2014, 15:02:25 CET »
0
In effetti in quel link manca un pezzo. GetView è un metodo dell'adaper.
Questa guida è più completa:
https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Limiti della listView e dell'Array adapter
« Risposta #9 il: 10 Dicembre 2014, 10:50:45 CET »
0
Ok dopo una fatica fisica e mentale enorme sono riuscito a buttare giù qualcosa....

Il problema ora sta nella "popolazione" della lista... so che nell'ultimo tutorial che è stato postato c'è chiaramente come si "popola" la list view ma io ho una lista di nomi (che conosco già) e mi sono un po bloccato sul miglior modo di ottenere tale risultato....

In pratica nella mia lista ci sono 2 voci (come ho già spiegato nel primo post), una avrà i nomi della lista (che conosco già tutti) l'altro è la distanza tra me e quel posto (che andrò a trovare con le Direction Api di google).

Ora posto i codici che uso:

UsersAdapterJava.java :
Codice (Java): [Seleziona]
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.ArrayList;


public class UsersAdapters extends ArrayAdapter<Ristoranti.User> {

    public UsersAdapters(Context context, ArrayList<Ristoranti.User> users) {
        super(context, 0, users);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Get the data item for this position
        Ristoranti.User user = getItem(position);
        // Check if an existing view is being reused, otherwise inflate the view
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.rowristoranti, parent, false);
        }
        // Lookup view for data population
        TextView tvName = (TextView) convertView.findViewById(R.id.Nome);
        TextView tvHome = (TextView) convertView.findViewById(R.id.Distanza);
        // Populate the data into the template view using the data object
        tvName.setText(user.nome);
        tvHome.setText(user.Distanza);
        // Return the completed view to render on screen
        return convertView;
    }
}

Ristoranti.java:
Codice (Java): [Seleziona]
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView;

import org.w3c.dom.Text;

import java.util.ArrayList;


public class Ristoranti extends Activity {

    ListView listView;
    ImageButton back;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ristoranti);

        // Get ListView object from xml
        listView = (ListView) findViewById(R.id.listView);
        back=(ImageButton) findViewById(R.id.Back);

        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        // Defined Array values to show in ListView
        String[] values = new String[] { "Il Capriolo","Chalet Pineta","Trattoria Corradi",
                "Agriturismo La Piana dei Sambuchi","Trattoria Mazzini","Trattoria Tarasconi"
                ,"Locanda Sport","Bar Trattoria da Poldo","Ristorante Pizzeria La Cava",
                "Trattoria La Pieve","Trattoria Pizzeria La Corte","Tana del Luppolo",
                "Ristorante del Parco Monte Fuso","Agriturismo Da Redeo","Agriturismo Airone Blu","Il Filare" };

       BubbleSort(values);


        // Define a new Adapter
        // First parameter - Context
        // Second parameter - Layout for the row
        // Third parameter - ID of the TextView to which the data is written
        // Forth - the Array of data


        // Construct the data source
        ArrayList<User> arrayOfUsers = new ArrayList<User>();
        // Create the adapter to convert the array to views
        UsersAdapters adapter = new UsersAdapters(this, arrayOfUsers);
        // Attach the adapter to a ListView
        final ListView listView = (ListView) findViewById(R.id.listView);

        User newUser = new User("Il Capriolo"," ");
        adapter.add(newUser);


        listView.setAdapter(adapter);


        //ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.rowristoranti,
                //R.id.Nome, values);

        // Assign adapter to ListView
        //listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                // ListView Clicked item index
                int itemPosition     = position;

                // ListView Clicked item value
                String  itemValue    = (String) listView.getItemAtPosition(position);

                Intent SingleRistoranti = new Intent(Ristoranti.this,Ristorante.class);
                SingleRistoranti.putExtra("Nome",itemValue);
                startActivity(SingleRistoranti);
            }
        });
    }

    private static void BubbleSort(String[] array) {
        String t;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j].compareTo(array[j + 1]) > 0) {
                    t = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = t;
                }
            }
        }
    }

    public class User{

        public String nome;
        public String Distanza;

        public User(String nome, String distanza) {
            this.nome = nome;
            this.Distanza = distanza;
        }


    }
}


Spero di essere stato il più chiaro possibile

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Limiti della listView e dell'Array adapter
« Risposta #10 il: 11 Dicembre 2014, 11:59:00 CET »
0
Ho modificato il codice in questo modo:
Codice (Java): [Seleziona]
 User newUser = new User(values[1],"Distanza:xxxKm");
        adapter.add(newUser);
        newUser = new User(values[2],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[3],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[4],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[5],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[6],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[7],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[8],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[9],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[10],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[11],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[12],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[13],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[14],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[15],"Distanza:15km");
        adapter.add(newUser);
        newUser = new User(values[16],"Distanza:15km");
        adapter.add(newUser);

ed il logcat mi da questo errore:
Codice: [Seleziona]
12-11 05:34:15.263    1012-1012/com.example.adorni.turisticapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.adorni.turisticapp/com.example.adorni.turisticapp.Ristoranti}: java.lang.ArrayIndexOutOfBoundsException: length=16; index=16
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ArrayIndexOutOfBoundsException: length=16; index=16
            at com.example.adorni.turisticapp.Ristoranti.onCreate(Ristoranti.java:100)
            at android.app.Activity.performCreate(Activity.java:5133)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)


ora...capisco che l'errore è causato dal fatto che inserisco troppi dati... però a me quei dati servono tutti

suggerimenti?

grazie in anticipo!

iClaude

  • Visitatore
Re:Limiti della listView e dell\'Array adapter
« Risposta #11 il: 11 Dicembre 2014, 12:01:38 CET »
+1
A occhio ci sono diverse cose da sistemare.
Appena ho un attimo di tempo ci do un'occhiata.

Post unito: 12 Dicembre 2014, 10:58:00 CET
Una prima cosa che vedo è che non hai usato il pattern ViewHolder: devi creare una classe ViewHolder con le TextView che vuoi impostare e nel metodo getView dell'adapter gestire anche l'ipotesi in cui convertView sia diversa da null.
Per il resto crea una classe che contiene tutte le informazioni richieste (nome e distanza) e quindi usa nell'adapter una List<tuaClasse> da cui poi recupererai i valori.
« Ultima modifica: 12 Dicembre 2014, 10:58:00 CET da iClaude, Reason: Merged DoublePost »