Autore Topic: Click su una riga in una ListView e visualizzazione dati su una seconda ListView  (Letto 405 volte)

Offline Emanuele Tinari

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Note 4
  • Sistema operativo:
    Windows 8.1
Buongiorno a tutti. Sto sviluppando un app che mi permetta di visualizzare dati prelevati da un database.
l'API level dell'emulatore, del progetto e del dispositivo è la API 22: Android 5.1 (Lollipop).
L'app in questione è per mio uso e consumo personale lavorativo perciò non richiedo possa esser utilizzata su altro dispositivo che non il mio Samsung Note 4.
Vengo subito al problema che mi si pone: ho un'activity in cui vengono "iniettate" 2 TextView. I dati nella prima TextView vengono prelevati da un database sqlite e caricati in 2 colonne; essi rappresentano di un cliente "A" tutti i relativi ordini presenti nel database [Colonna A] e la relativa data [Colonna B].
Premendo poi su di un'ordine nella TextView1, vengono visualizzati sulla TextView2 i dettagli relativi all'ordine cliccato.
Premetto che l'activity e il relativo codice Java sottostante girano bene e non mi dà alcun problema reale per cui non posso postare alcun LogCat d'errore.
Il problema si presenta cliccando su un secondo (o terzo o quarto...) ordine: la TextView2 NON viene purtroppo svuotata pur avendo provato ad inserire nel codice Java righe di svuotamento delle variabili utilizzate.
Pertanto le righe dei dettagli degli ordini si vengono ad inserire di seguito alle precedenti.
Il secondo problema di visualizzazione, e che quindi non mi dà alcun errore, è che al premere della riga dell'ordine nella TextView1, le intestazioni di colonna nella ListView2 scompaiono.
Posto di seguito le schermate acquisite con evidenziato il problema, il codice xml delle activity coinvolte e il relativo codice java sottostante.

Activity activity_clienti_vendite_in_dettaglio

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<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:layout_gravity="center"
   tools:context=".Clienti_Vendite_In_Dettaglio">
        <!-- Intestazioni colonne Ordini -->
        <ListView
           android:id="@+id/list_Intestaz_Ord"
           android:background="@color/grigioscuro"
           android:layout_height="30dp"
           android:layout_width="match_parent"
           android:layout_marginTop="0dp"
           android:layout_alignParentStart="false" />
        <!-- Colonne Ordini -->
        <ListView
           android:id="@+id/list_Ordini"
           android:layout_height="180dp"
           android:layout_width="match_parent"
           android:background="@android:color/white"
           android:layout_alignParentEnd="false"
           android:layout_alignParentStart="false"
           android:divider="@color/colorPrimaryDark"
           android:dividerHeight="1dip"
           android:layout_below="@+id/list_Intestaz_Ord" />
        <!-- Intestazioni colonne Dettagli Ordini -->
        <ListView
           android:id="@+id/list_Intestaz_Dett_Ord"
           android:layout_height="30dp"
           android:layout_width="match_parent"
           android:background="@color/grigioscuro"
           android:layout_alignParentEnd="false"
           android:layout_below="@+id/list_Ordini" />
        <!-- Colonne Dettagli Ordini -->
        <ListView
           android:id="@+id/list_Dettagli_Ordini"
           android:layout_height="210dp"
           android:layout_width="match_parent"
           android:background="@android:color/white"
           android:divider="@color/colorPrimaryDark"
           android:dividerHeight="1dip"
           android:layout_alignEnd="@id/list_Intestaz_Dett_Ord"
           android:layout_below="@+id/list_Intestaz_Dett_Ord"
           android:layout_alignParentEnd="false" />
        <!-- Qui viene inserito il totale dell'ordine -->
        <TextView
           android:id="@+id/textTotOrdine"
           android:layout_height="50dp"
           android:layout_width="150dp"
           android:layout_gravity="left"
           android:layout_marginBottom="16dp"
           android:layout_alignParentBottom="true"
           android:layout_alignParentLeft="true"
           android:layout_marginLeft="16dp" />
        <Button
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/btnEsci"
           android:id="@+id/btnEsci"
           android:layout_gravity="right"
           android:layout_alignParentEnd="true"
           android:layout_alignParentStart="false"
           android:layout_alignParentBottom="true"
           android:layout_alignParentRight="true"
           android:layout_marginRight="16dp"
           android:layout_marginBottom="16dp" />
    </RelativeLayout>

Activity colonne_ordini

Codice (XML): [Seleziona]
<?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="horizontal" >
    <!-- Colonna ID Ordine -->
    <TextView
       android:id="@+id/colonna_id_ordine"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:textColor="@android:color/black"
       android:layout_weight="1"
       android:gravity="center_horizontal" />
    <!-- Colonna Data Ordine -->
    <TextView
       android:id="@+id/colonna_data_ordine"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:textColor="@android:color/black"
       android:layout_weight="1"
       android:gravity="center_horizontal" />
</LinearLayout>

Activity colonne_ordini_dettagli

Codice (XML): [Seleziona]
<?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="horizontal" >
    <!-- Colonna Nome prodotto -->
    <TextView
       android:id="@+id/colonna_prodotto"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:textColor="@android:color/black"
       android:layout_weight="3.5"
       android:text=""
       android:textSize="12sp" />
    <!-- Colonna Quantità -->
    <TextView
       android:id="@+id/colonna_qta"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:textColor="@android:color/black"
       android:layout_weight=".7"
       android:textAlignment="viewEnd"
       android:text=""
       android:textSize="12sp" />
    <!-- Colonna Prezzo unitario -->
    <TextView
       android:id="@+id/colonna_prezzo"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:textColor="@android:color/black"
       android:layout_weight=".9"
       android:textAlignment="viewEnd"
       android:text=""
       android:textSize="12sp" />
    <!-- Colonna Prezzo complessivo -->
    <TextView
       android:id="@+id/colonna_importo"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:textColor="@android:color/black"
       android:layout_weight="1"
       android:textAlignment="viewEnd"
       android:text=""
       android:textSize="12sp" />
</LinearLayout>

Class Clienti_Vendite_In_Dettaglio

Codice (Java): [Seleziona]
package it.emanueletinari.lavoro;

import android.app.ActionBar;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Html;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;

// Created by Emanuele on 12/02/2016.

public class Clienti_Vendite_In_Dettaglio extends AppCompatActivity
{
    public void setActionBarColor(int parsedColor)
    {
        ActionBar actionBar = getActionBar();
        getSupportActionBar().setBackgroundDrawable(new ColorDrawable(parsedColor));
    }
    ListView listwiew_intestaz_ord, listwiew_ordini, listwiew_intestaz_dett_ord, listwiew_dettagli_ordini;
    TextView textview_TotOrd;
    ArrayList<HashMap<String, String>> arraylist_intestaz_ord, arraylist_ordini, arraylist_intestaz_dett_ord, arraylist_dettagli_ordini;
    ListAdapter listadapter_intestaz_ord, listadapter_ordini, listadapter_intestaz_dett_ord, listadapter_dettagli_ordini;
    HashMap<String, String> hashmap_intestaz_ord, hashmap_ordini, hashmap_intestaz_dett_ord, hashmap_dettagli_ordini;
    String cod_cli;
    public float totaleOrdine;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_clienti_vendite_in_dettaglio);
        // l'intent di questa activity
        Intent intent = getIntent();
        String pkg = getPackageName();
        // Recupero i dati
        cod_cli = intent.getStringExtra(pkg + ".CodCliPassato");
        String nomesoc = intent.getStringExtra(pkg + ".NomeCliPassato");

        // Imposto il titolo dell'Action Bar
        ActionBar actionBar = getActionBar();
        getSupportActionBar().setDisplayShowTitleEnabled(true);
        getSupportActionBar().setTitle(Html.fromHtml("Ordini cliente - " + nomesoc));
        // Imposto il colore dell'Action Bar
        Clienti_Vendite_In_Dettaglio.this.setActionBarColor(Color.parseColor("#000000"));
        // Codice bottone Esci
        Button btnEsci = (Button) findViewById(R.id.btnEsci);
        btnEsci.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                // TODO Auto-generated method stub
                finish();
            }
        });
        // Recupero gli id
        listwiew_intestaz_ord = (ListView) findViewById(R.id.list_Intestaz_Ord);
        listwiew_ordini = (ListView) findViewById(R.id.list_Ordini);
        listwiew_intestaz_dett_ord = (ListView) findViewById(R.id.list_Intestaz_Dett_Ord);
        listwiew_dettagli_ordini = (ListView) findViewById(R.id.list_Dettagli_Ordini);
        showActivity();
    }
    public void showActivity()
    {
        arraylist_intestaz_ord = new ArrayList<HashMap<String, String>>();
        arraylist_ordini = new ArrayList<HashMap<String, String>>();
        arraylist_intestaz_dett_ord = new ArrayList<HashMap<String, String>>();
        arraylist_dettagli_ordini = new ArrayList<HashMap<String, String>>();
        // Visualizzo le intestazioni di colonna degli Ordini
        hashmap_intestaz_ord = new HashMap<String, String>();
        hashmap_intestaz_ord.put("id_ordine", "ID Ordine");
        hashmap_intestaz_ord.put("data_ordine", "Data Ordine");
        arraylist_intestaz_ord.add(hashmap_intestaz_ord);
        try
            {
                listadapter_intestaz_ord = new SimpleAdapter(this, arraylist_intestaz_ord, R.layout.colonne_ordini,
                    new String[]
                        {
                            "id_ordine", "data_ordine"
                        }
                    , new int[]
                        {
                            R.id.colonna_id_ordine, R.id.colonna_data_ordine
                        });
                listwiew_intestaz_ord.setAdapter(listadapter_intestaz_ord);
            }
        catch (Exception e)
            {
                e.printStackTrace();
            }
        // Visualizzo il contenuto degli Ordini
        SQLiteDatabase myDb;
        myDb = SQLiteDatabase.openDatabase("//data/data/it.emanueletinari.lavoro/databases/lavoro.db", null, Context.MODE_PRIVATE);
        String Query6 = "SELECT * FROM Ordini WHERE Ordini.IDCliente" + "=\""+ cod_cli +"\""+ " ORDER BY Ordini.IDOrdine DESC";
        Cursor cur6 = myDb.rawQuery(Query6, null);
            if(cur6.getCount()==0)
                {
                    Util.makeToast(this, "Non ci sono dati da mostrare.");
                }
            else
                {
                    for (int i = 0; i < cur6.getCount(); i++)
                        {
                            while(cur6.moveToNext())
                                {
                                    // dichiaro ed azzero le stringhe
                                    String id_ordine;
                                    String data_ordine;
                                    // inserisco i valori della colonna 0 e 2 della tabella Ordini
                                    id_ordine = cur6.getString(0);
                                    data_ordine = cur6.getString(2);
                                    // converto la data estesa nel formato dd/MMM/yyy
                                    hashmap_ordini = new HashMap<String, String>();
                                    hashmap_ordini.put("dati_prima_colonna", id_ordine);
                                    hashmap_ordini.put("dati_seconda_colonna", data_ordine);
                                    arraylist_ordini.add(hashmap_ordini);
                                    listadapter_ordini = new SimpleAdapter(this, arraylist_ordini, R.layout.colonne_ordini,
                                            new String[]
                                                {
                                                    "dati_prima_colonna", "dati_seconda_colonna"
                                                }
                                            , new int[]
                                                {
                                                    R.id.colonna_id_ordine, R.id.colonna_data_ordine
                                                });
                                    listwiew_ordini.setAdapter(listadapter_ordini);
                                }
                        }
                }
        // chiudo la connessione
        cur6.close();
        myDb.close();
        listwiew_ordini.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> adattatore, final View componente, int pos, long id)
            {
                // Svuoto le TextView prima di inserire i dati
                TextView colonna_prodotto = (TextView) findViewById(R.id.colonna_prodotto);
                colonna_prodotto.setText("");
                TextView colonna_qta = (TextView) findViewById(R.id.colonna_qta);
                colonna_qta.setText("");
                TextView colonna_prezzo = (TextView) findViewById(R.id.colonna_prezzo);
                colonna_prezzo.setText("");
                TextView colonna_importo = (TextView) findViewById(R.id.colonna_importo);
                colonna_importo.setText("");
                ListView list_Dettagli_Ordini = (ListView) findViewById(R.id.list_Dettagli_Ordini);
                list_Dettagli_Ordini.setAdapter(null);
                listwiew_dettagli_ordini.setAdapter(null);

                // Recupero il codice dell' ordine cliccato
                String cod_ordine = ((TextView) componente.findViewById(R.id.colonna_id_ordine)).getText().toString();
                // Visualizzo il contenuto del Dettaglio Ordine
                SQLiteDatabase myDb;
                myDb = SQLiteDatabase.openDatabase("//data/data/it.emanueletinari.lavoro/databases/lavoro.db", null, Context.MODE_PRIVATE);
                String Query10 = "SELECT [Dettagli ordini].IDOrdine, Prodotti.NomeProd, [Dettagli ordini].QtaVen," +
                        "        [Dettagli ordini].PrezzoCliEma, [Dettagli ordini].IVA" +
                        "        FROM  Ordini" +
                        "        INNER JOIN Clienti ON (Clienti.IDCliente = Ordini.IDCliente)" +
                        "        INNER JOIN [Dettagli ordini] ON (Ordini.IDOrdine = [Dettagli ordini].IDOrdine)" +
                        "        INNER JOIN Prodotti ON (Prodotti.IDProdotto = [Dettagli ordini].IDProdotto)" +
                        "        WHERE Ordini.IDOrdine" + "=\""+ cod_ordine +"\""+
                        "        ORDER BY Ordini.IDOrdine, Prodotti.NomeProd";
                Cursor cur10 = myDb.rawQuery(Query10, null);
                if(cur10.getCount()==0)
                {
                    Util.makeToast(Clienti_Vendite_In_Dettaglio.this, "Non ci sono dati da mostrare.");
                }
                else
                {
                    for (int i = 0; i < cur10.getCount(); i++)
                    {
                        while(cur10.moveToNext())
                        {
                            // dichiaro ed azzero le variabili
                            String nome_prodotto;
                            String qta;
                            String prezzo_unitario;
                            String importo;
                            Float float_importo;
                            // inserisco i valori delle colonne della query escluso il codice ordine
                            nome_prodotto = cur10.getString(1);
                            qta = cur10.getString(2);
                            prezzo_unitario = cur10.getString(3);
                            float_importo = Float.parseFloat(qta.replace(",", ".")) * Float.parseFloat(prezzo_unitario.replace(",", "."));
                            importo = Float.toString(float_importo);
                            prezzo_unitario = Util.roundDueDecimali(prezzo_unitario.replace(",", "."));
                            importo = Util.roundDueDecimali(importo.replace(",", "."));
                            totaleOrdine =  totaleOrdine + Float.parseFloat(importo.replace(",", "."));
                            hashmap_dettagli_ordini = new HashMap<String, String>();
                            hashmap_dettagli_ordini.put("colonna_prodotto", nome_prodotto);
                            hashmap_dettagli_ordini.put("colonna_qta", qta);
                            hashmap_dettagli_ordini.put("colonna_prezzo", prezzo_unitario.replace(".", ","));
                            hashmap_dettagli_ordini.put("colonna_importo", importo.replace(".", ","));
                            arraylist_dettagli_ordini.add(hashmap_dettagli_ordini);
                        }
                        try
                        {
                            listadapter_dettagli_ordini = new SimpleAdapter(Clienti_Vendite_In_Dettaglio.this, arraylist_dettagli_ordini, R.layout.colonne_ordini_dettagli,
                                    new String[]
                                            {
                                                "colonna_prodotto", "colonna_qta", "colonna_prezzo", "colonna_importo"
                                            }
                                    , new int[]
                                    {
                                        R.id.colonna_prodotto, R.id.colonna_qta, R.id.colonna_prezzo, R.id.colonna_importo
                                    });
                            listwiew_dettagli_ordini.setAdapter(listadapter_dettagli_ordini);
                        }
                        catch (Exception e)
                        {
                            e.printStackTrace();
                        }
                        DecimalFormat numberFormat = new DecimalFormat("0.00");
                        textview_TotOrd = (TextView) findViewById(R.id.textTotOrdine);
                        textview_TotOrd.setText("Totale Ordine: \n" + numberFormat.format(totaleOrdine));
                    }
                }
                // chiudo la connessione
                cur10.close();
                myDb.close();
            }
        });
        // Visualizzo le intestazioni di colonna del Dettaglio Ordini
        hashmap_intestaz_dett_ord = new HashMap<String, String>();
        hashmap_intestaz_dett_ord.put("colonna_prodotto", "Prodotto");
        hashmap_intestaz_dett_ord.put("colonna_qta", " Q.tà");
        hashmap_intestaz_dett_ord.put("colonna_prezzo", " Prezzo");
        hashmap_intestaz_dett_ord.put("colonna_importo", " Importo");
        arraylist_intestaz_dett_ord.add(hashmap_intestaz_dett_ord);
        try
        {
            listadapter_intestaz_dett_ord = new SimpleAdapter(this, arraylist_intestaz_dett_ord, R.layout.colonne_ordini_dettagli,
                new String[]
                    {
                        "colonna_prodotto", "colonna_qta", "colonna_prezzo", "colonna_importo"
                    }
                , new int[]
                    {
                        R.id.colonna_prodotto, R.id.colonna_qta, R.id.colonna_prezzo, R.id.colonna_importo
                    });
            listwiew_intestaz_dett_ord.setAdapter(listadapter_intestaz_dett_ord);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

Qualcuno potrebbe suggerirmi come ottenere lo svuotamento della seconda TextView, nonchè far rimanere le intestazioni delle colonne presenti nella seconda ListView al loro posto?
Ogni suggerimento è bene accetto. Grazie in anticipo.

Emanuele Tinari

Offline Emanuele Tinari

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Note 4
  • Sistema operativo:
    Windows 8.1
91 visulizzazioni, 0 risposte... potrei battere il record del sito stavolta ! :D :D :D

Offline LinkOut

  • Utente normale
  • ***
  • Post: 272
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Ciao, ho provato a capire il tuo codice ma mi risulta difficile, personalmente non lo trovo leggibile.

Ti consiglio di usare un approccio "BaseAdapter" per la lista utilizzando una "row" custom (anche se ha solo una TextView) perchè così è più chiaro. Ovviamente sposta l'adapter FUORI dalla classe che ti rappresenta l'Activity (sempre per la questione leggibilità).

Ti ho scritto un esempio al volo:

Codice (Java): [Seleziona]
public class ExampleAdapter extends BaseAdapter {

    private Context mContext;
    private List<String> mData;
    private static LayoutInflater mInflater = null;

    public ExampleAdapter(Context context, List<String> data) {
        this.mContext = context;
        this.mData = data;
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public String getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;
        View v = convertView;

        if (v == null) {
            v = mInflater.inflate(R.layout.tuo_layout_della_row, null);
            holder = new ViewHolder();
            //Setting refs
            holder.tuaTextView = (TextView) v.findViewById(R.id.tuaTextView);
            v.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        String actualString = getItem(position);

        //Fai quallo che devi fare con la stringa
        //Per esempio:
        holder.tuaTextView.setText(actualString);

        return v;
    }

    //ViewHolder
    static class ViewHolder {
        TextView tuaTextView;
    }
}