Autore Topic: ListView cliccabile per avere poi determinate informazioni  (Letto 1260 volte)

Offline slasher

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Emulatore ADT :-D
  • Sistema operativo:
    Windows Vista (purtroppo) \ Linux Ubuntu
ListView cliccabile per avere poi determinate informazioni
« il: 30 Aprile 2011, 19:59:34 CEST »
0
Ciao a tutti, grazie all'ottimo tutorial presente nel vostro forum ho costruito la mia listview personalizzata di elementi.
Il mio layout per ogni riga è il seguente

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="vertical">
  <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
                  android:textColor="@color/rosso"
                  android:layout_width="fill_parent" android:layout_height="wrap_content"
                  android:layout_marginTop="5dp" android:textSize="15dp"
                  android:textStyle="bold"  android:id="@+id/casella_eventi_nomelocale"
                  android:checkMark="?android:attr/listChoiceIndicatorSingle"></CheckedTextView>
  <LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:orientation="horizontal">
                <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Ubicazione: " android:textColor="@color/giallo"></TextView>
                <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/casella_eventi_ubicazione"></TextView>
  </LinearLayout>
  <LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:orientation="horizontal">
                <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Giorno e orario: " android:textColor="@color/giallo"></TextView>
                <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/casella_eventi_orari"></TextView>
  </LinearLayout>
  <LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:orientation="horizontal"
 android:layout_marginBottom="5dp">
                <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Posti disponibili: " android:textColor="@color/giallo"></TextView>
                <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/casella_eventi_posti"></TextView>
  </LinearLayout>
 
 
</LinearLayout>

il layout della mia activity è

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="vertical">
  <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Risultati secondo il filtro imposto" android:layout_gravity="top|center" android:textStyle="bold" android:textSize="17dp" android:textColor="@color/giallo" android:layout_marginBottom="15dp"></TextView>
  <LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal" android:layout_marginBottom="10dp">
                <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"
                                android:text="Profilo locale"></Button>
                <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"
                                android:text="+Info"></Button>
                <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"
                                android:text="Richiedi data"></Button>
  </LinearLayout>
  <ListView xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:id="@+id/risultati_eventi"></ListView>
</LinearLayout>

il codice java è invece il seguente

Codice (Java): [Seleziona]
package progetto.login;

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONObject;

import progetto.classi.Evento;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CheckedTextView;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class Mostra_eventi extends Activity implements OnItemClickListener{

        private final static String LOG_TAG= "MostraEventiActivity";   
       
        private JSONObject jObject;
        private Evento[] eventi;
        private String username_band;
        private String username,nome,indirizzo,paese,provincia,ora,minuti,genere,retribuzione;
        private String iscritti=null,confermati=null;
        private int giorno,mese,anno,posti;
        private String result;
        public Boolean aggiornato=false;
        private ListView lista;
       
       
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.mostra_eventi);
        Intent intent=getIntent(); // l'intent di questa activity      
        String pkg=getPackageName();      
        username_band=intent.getStringExtra(pkg+".User");
        result=intent.getStringExtra(pkg+".Result");
        System.out.println(result);
       
        try {
                        parse();                                               
                } catch (Exception e) {
                        e.printStackTrace();
                }
               
                //utilizzo dell'adapter
        lista = (ListView)findViewById(R.id.risultati_eventi);
        lista.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        lista.setAdapter(carica_risultati());
        lista.setOnItemClickListener(this);
       
        }
       
        private SimpleAdapter carica_risultati(){
                //popolamento arraylist
                ArrayList<Evento> array_ris = new ArrayList<Evento>();
                for (int k=0;k<eventi.length;k++){
                        array_ris.add(eventi[k]);
                }
                       
                        //Questa è la lista che rappresenta la sorgente dei dati della listview
                //ogni elemento è una mappa(chiave->valore)
                ArrayList<HashMap<String, Object>> data=new ArrayList<HashMap<String,Object>>();
               
                for(int s=0;s<array_ris.size();s++){
                    Evento e=array_ris.get(s);// per ogni posto all'inteno della lista
                   
                    HashMap<String,Object> eventiMap=new HashMap<String, Object>();//creiamo una mappa di valori
                   
                    eventiMap.put("nome", e.getNome());                                            
                    eventiMap.put("ubicazione", e.getIndirizzo()+","+e.getPaese()+" ("+e.getProvincia()+")");
                    eventiMap.put("orario", e.getGiorno()+"-"+e.getMese()+"-"+e.getAnno()+" ; h. "+e.getOra()+":"+e.getMinuti());// per la chiave vicinanza
                    eventiMap.put("posti",e.getPosti());
                    data.add(eventiMap);  //aggiungiamo la mappa di valori alla sorgente dati
                   
                }
               
                String[] from={"nome","ubicazione","orario","posti"}; //dai valori contenuti in queste chiavi
                int[] to={R.id.casella_eventi_nomelocale,R.id.casella_eventi_ubicazione,R.id.casella_eventi_orari,R.id.casella_eventi_posti};//agli id delle view
               
              //costruzione dell adapter
                SimpleAdapter adapter=new SimpleAdapter(
                                getApplicationContext(),
                                data,//sorgente dati
                                R.layout.adapter_eventi, //layout contenente gli id di "to"
                                from,
                                to);           
             
                return adapter;                
               
        }
       
       
        private void parse() {
                 
                  try{
                       
                        jObject = new JSONObject(result);
                                       
                        JSONArray risultati = jObject.getJSONArray("results");
                        eventi = new Evento[risultati.length()];
                        for (int j=0;j<risultati.length();j++){
                                username=risultati.getJSONObject(j).getString("username").toString();
                                nome=risultati.getJSONObject(j).getString("nome").toString();
                                indirizzo=risultati.getJSONObject(j).getString("indirizzo").toString();
                                paese=risultati.getJSONObject(j).getString("paese").toString();
                                provincia=risultati.getJSONObject(j).getString("provincia").toString();
                                String giornotext=risultati.getJSONObject(j).getString("giorno").toString();
                                giorno=Integer.parseInt(giornotext);
                                String mesetext=risultati.getJSONObject(j).getString("mese").toString();
                                mese=Integer.parseInt(mesetext);
                                String annotext=risultati.getJSONObject(j).getString("anno").toString();
                                anno=Integer.parseInt(annotext);
                                ora=risultati.getJSONObject(j).getString("ora").toString();
                                minuti=risultati.getJSONObject(j).getString("minuti").toString();
                                String postitext=risultati.getJSONObject(j).getString("posti").toString();
                                posti=Integer.parseInt(postitext);
                                genere=risultati.getJSONObject(j).getString("genere").toString();
                                retribuzione=risultati.getJSONObject(j).getString("retribuzione").toString();
                                iscritti=risultati.getJSONObject(j).getString("iscritti").toString();
                                confermati=risultati.getJSONObject(j).getString("confermati").toString();
                       
                       
                                Evento evento_singolo = new Evento(username,nome,indirizzo,paese,provincia,giorno,mese,anno,ora,minuti,posti,genere,retribuzione,iscritti,confermati);
                                eventi[j]=evento_singolo;      
                               
                       
                        }//fine ciclo risulati
                         
                  } catch (Exception e) {
                            System.out.println("Errore:"+e);
                  }
                }//fine Parse

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // TODO Auto-generated method stub
                CheckedTextView nome = (CheckedTextView)findViewById(R.id.casella_eventi_nomelocale);
                nome.setChecked(true);
        }
}

Spiego le mie scelte...sul libro di massimo carli ho visto che settando la listview come choice_mode_single potevo selezionare ogni item della listview ottenendo il segno di "spunta" . Ovviamente come suggerito dal libro ho optato per un elemento "Clickable" come il CheckedTextView contenuto nella View di ogni riga...
Il problema è che alla selezione della riga non mi succedeva niente....ho quindi aggiunto il listener alla riga (ultima parte del codice)

Codice (Java): [Seleziona]
@Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // TODO Auto-generated method stub
                CheckedTextView nome = (CheckedTextView)findViewById(R.id.casella_eventi_nomelocale);
                nome.setChecked(true);
        }

per far "svegliare" la mia checked...
risultato? La spunta al clic stavolta appare però praticamente così mi rimane...non è che poi si spegne quando clicco un'altra riga (è ovvio d'altronde)...però come cavolo risolvo sto problema? Perché poi ho bisogno che della mia riga evidenziata per notificare la scelta all'utente che dovrà selezionare una delle opzioni in alto presenti nei tre button (ancora da implementare)

Offline slasher

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Emulatore ADT :-D
  • Sistema operativo:
    Windows Vista (purtroppo) \ Linux Ubuntu
Re:ListView cliccabile per avere poi determinate informazioni
« Risposta #1 il: 04 Maggio 2011, 11:11:10 CEST »
0
a nessuno è capitato lo stesso problema o sa fornirmi un aiuto o un'idea?

Offline DarkPhoinix

  • Utente junior
  • **
  • Post: 133
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC HD2 & Samsung Galaxy SII
  • Sistema operativo:
    LNX
Re:ListView cliccabile per avere poi determinate informazioni
« Risposta #2 il: 12 Maggio 2011, 15:40:17 CEST »
0
è la stessa cosa che sto cercando io...