Autore Topic: Listview---> Dettaglio ---> swipe dettaglio  (Letto 2649 volte)

Offline Max

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Ace
Listview---> Dettaglio ---> swipe dettaglio
« il: 08 Ottobre 2012, 11:20:56 CEST »
0
Salve a tutti
Quello che ho fatto finora:
Da un feed rss ho creato una listview con foto e titoli delle news del feed. Cliccando sulla singola voce della mia lista accedo al dettaglio dove ritrovo foto, titolo ed in piu' l'articolo per esteso. Se voglio leggermi un altra notizia basta che torno alla view della lista.
Quello che vorrei fare:
Vorrei aggiungere la feature che mi permette, nella view dettaglio, di sfogliare "orizzontalmente" gli articoli senza dover tornare nella view della lista.

Che faccio?

Grazie

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Listview---> Dettaglio ---> swipe dettaglio
« Risposta #1 il: 08 Ottobre 2012, 11:58:59 CEST »
0
Per una cosa molto simile io ho usato un ViewFlipper.
L'activity che visualizza l'item è agganciata ad un layout composto solo da un ViewFlipper; all'onCreate carico la ViewFlipper con tante view quante sono gli item che potenzialmente possono essere visualizzati, e guardo negli extra se mi viene passata la posizione da mostrare per prima.
Quando viene cliccata un'entry nella  lista apro l'activity passando negli extra la posizione della View figlia da mostrare all'apertura.
Sempre nell'activity composta dal ViewFlipper ho sovrascritto l'onTouchEvent, in modo da intercettare lo swipe, capire in che direzione è fatto e determinare quale view figlia della ViewFlipper mostrare.

Codice (Java): [Seleziona]
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.view_rss_items); // layout composto solo dalla ViewFlipper con id item_flipper

    Intent intent = getIntent();
    // item rss su cui ho cliccato
    int position = intent.getIntExtra(Constants.EXTRA_RSS_ITEM_POSITION_IN_CATEGORY, -1);

    // mi faccio dare tutti gli item rss che posso mostrare
    items = ...

    // recupero il flipper
    flipper = (ViewFlipper) this.findViewById(R.id.item_flipper);
    flipper.removeAllViews();

    // per ogni item rss creo una view con tutti i dati (titolo, immagini, testo...)
    for(Object item:items) {
       View view = ...
       // e la aggiungo al flipper
       flipper.addView(view);
    }

    // mostro l'item indicato negli extra
    flipper.setDisplayChild(position);
  }

  // per lo swipe
  protected float lastX;

  @Override
  public boolean onTouchEvent(MotionEvent touchevent) {
    switch (touchevent.getAction()) {
    case MotionEvent.ACTION_DOWN: {
      lastX = touchevent.getX();
      break;
    }
    case MotionEvent.ACTION_UP: {
      float currentX = touchevent.getX();
      if (lastX > currentX) {
        int position = flipper.getDisplayedChild();
        int pPosition = position + 1;
        if (pPosition >= items.size())
          pPosition = 0;
        flipper.setDisplayedChild(pPosition);
      }
      if (lastX < currentX) {
        int position = flipper.getDisplayedChild();
        int pPosition = position - 1;
        if (pPosition < 0)
          pPosition = items.size() - 1;
        flipper.setDisplayedChild(pPosition);
      }
      break;
    }

    return false;
  }

Non riporto come recuperare gli items rss e come costruire le view da aggiungere al flipper, perché strettamente dipende da come hai impostato le cose nella tua app (ma indicativamente per le view si tratta sostanzialmente di sfruttare la classe android LayoutInflater, in modo da ottenere una view costruita sul layout che attualmente utilizzi per mostrare l'item rss, e popolarla prima di aggiungerla al flipper).

Offline Max

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Ace
Re:Listview---> Dettaglio ---> swipe dettaglio
« Risposta #2 il: 08 Ottobre 2012, 12:32:28 CEST »
0
Sakazaki interessante grazie ma la mia inesperienza mi porta a fare delle banali domande
le prime che mi vengono in mente sono riguardo il tuo commento: "per ogni item rss creo una view con tutti i dati (titolo, immagini, testo...)" devo quindi creare i controllli textview e imageview nel ciclo. Non posso crearli prima con un layout xml dando dei settaggi specifici e poi referenziarla in qualche modo?


ps. le altre domande te le faccio mano mano :) grazie per la pazienza
« Ultima modifica: 08 Ottobre 2012, 12:36:13 CEST da Max »

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Listview---> Dettaglio ---> swipe dettaglio
« Risposta #3 il: 08 Ottobre 2012, 12:40:02 CEST »
0
LayoutInflater è la risposta, giovane padawan  :-P

Rispondo meglio: LayoutInflater è il meccanismo con cui si puo' recuperare una view precostruita partendo da un xml di layout

Dove ho messo View = ... andrebbe messo qualcosa di simile a:

Codice (Java): [Seleziona]
// recupero il layout inflater di sistema
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// con l'inflater carico una view partendo dall'xml di layout (quella che attualmente usi gia' puo' andar bene)
View view = inflater.inflate(R.id.mio_layout_item, flipper, false);
// popolo la view come farei normalmente (view.findViewById(...) ecc...)

//TODO ...

// e la aggiungo al flipper
flipper.addView(view);
« Ultima modifica: 08 Ottobre 2012, 12:46:37 CEST da Sakazaki »

Offline Max

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Ace
Re:Listview---> Dettaglio ---> swipe dettaglio
« Risposta #4 il: 08 Ottobre 2012, 13:22:10 CEST »
0
View view = inflater.inflate(R.id.mio_layout_item, flipper, false);


perche id non dovrebbe essere layout?

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Listview---> Dettaglio ---> swipe dettaglio
« Risposta #5 il: 08 Ottobre 2012, 13:26:22 CEST »
0
View view = inflater.inflate(R.id.mio_layout_item, flipper, false);


perche id non dovrebbe essere layout?

Perché ho sbagliato  :-P

Offline Max

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Ace
Re:Listview---> Dettaglio ---> swipe dettaglio
« Risposta #6 il: 08 Ottobre 2012, 14:33:54 CEST »
0
Il tuo aiuto è stato prezioso per ora, ho provato con un semplice Arraylist e funziona, volendo pero' passare tramite intent un
ArrayList<ArrayList<String>>???

edit:
PERFETTO funziona tutto passo nell'intent 4 arraylist distinte, l'unico neo e' che quando mi posiziono sulla prima e sfoglio indietro mi fa vedere l'ultima
« Ultima modifica: 08 Ottobre 2012, 15:10:03 CEST da Max »

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
R: Listview---> Dettaglio ---> swipe dettaglio
« Risposta #7 il: 08 Ottobre 2012, 16:09:55 CEST »
0
L'effetto di rotazione dal primo all'ultimo e dall'ultimo al primo è voluto, guarda l'onTouchEvent e noterai che questo comportamento è gestito li =)

Inviato dal mio XT910 con Tapatalk 2


Offline Max

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Ace
Re:Listview---> Dettaglio ---> swipe dettaglio
« Risposta #8 il: 08 Ottobre 2012, 16:24:34 CEST »
0
grazie Saka mi sei stato di enorme aiuto

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Listview---> Dettaglio ---> swipe dettaglio
« Risposta #9 il: 09 Ottobre 2012, 09:22:40 CEST »
0
grazie Saka mi sei stato di enorme aiuto
Ottimo, lieto di essere stato utile  :-)
Marca pure il thread come risolto.

Offline Phate

  • Utente junior
  • **
  • Post: 123
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S
  • Sistema operativo:
    Windows 7
Re:Listview---> Dettaglio ---> swipe dettaglio
« Risposta #10 il: 09 Ottobre 2012, 09:50:50 CEST »
0
Mah a me non pare granché come suluzione: anche io ho fatto un'app del genere e nelle impostazioni come valore minimo di articoli in lista c'è 20 (il max è 100...).
Ora, magari l'utente vuole vedere solo i primi 2-3, magari proprio uno solo...e tu ne carichi in memoria subito 20!!100 nel caso peggiore!!
Questo aggiunge uno spreco di memoria assurdo, che tra l'altro potrebbe far crashare l'app su alcuni cellulari a seconda di quanto complessa è la view per visualizzare la notizia, oltre che una lentezza iniziale per aprire la prima notizia proprio perché in realtà ne stai aprendo molte di più.

Io ti direi di guardarti questo tutorial: SavageLook.com  &raquo; Swipes, or “Flings”, for Navigation in Android) e crearti tu una logica applicativa in cui, a seconda di destra o sinistra, crei una view anziché un'altra, AL MOMENTO.
edit:
anzi volendo penso puoi modificare sempre la stessa coi nuovi dati così non ha neanche bisogno di crearne altre.
« Ultima modifica: 09 Ottobre 2012, 10:06:48 CEST da Phate »

Offline Max

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Ace
Re:Listview---> Dettaglio ---> swipe dettaglio
« Risposta #11 il: 09 Ottobre 2012, 12:14:26 CEST »
0
Mah a me non pare granché come suluzione: anche io ho fatto un'app del genere e nelle impostazioni come valore minimo di articoli in lista c'è 20 (il max è 100...).
Ora, magari l'utente vuole vedere solo i primi 2-3, magari proprio uno solo...e tu ne carichi in memoria subito 20!!100 nel caso peggiore!!
Questo aggiunge uno spreco di memoria assurdo, che tra l'altro potrebbe far crashare l'app su alcuni cellulari a seconda di quanto complessa è la view per visualizzare la notizia, oltre che una lentezza iniziale per aprire la prima notizia proprio perché in realtà ne stai aprendo molte di più.

Io ti direi di guardarti questo tutorial: SavageLook.com  &raquo; Swipes, or “Flings”, for Navigation in Android) e crearti tu una logica applicativa in cui, a seconda di destra o sinistra, crei una view anziché un'altra, AL MOMENTO.
edit:
anzi volendo penso puoi modificare sempre la stessa coi nuovi dati così non ha neanche bisogno di crearne altre.

Ho installato l'esempio dal sito non succede nulla sbaglio sicuramente qualcosa
giusto per capire come funziona e metterci le mani
« Ultima modifica: 09 Ottobre 2012, 12:30:11 CEST da Max »

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Listview---> Dettaglio ---> swipe dettaglio
« Risposta #12 il: 09 Ottobre 2012, 13:43:17 CEST »
0
Mah a me non pare granché come suluzione: anche io ho fatto un'app del genere e nelle impostazioni come valore minimo di articoli in lista c'è 20 (il max è 100...).
[...]
anzi volendo penso puoi modificare sempre la stessa coi nuovi dati così non ha neanche bisogno di crearne altre.

Sicuramente non è la soluzione ottima, ma non pretende nemmeno di esserlo =)
All'epoca io ero più interessato a "giocare" con la ViewFlipper, che non avevo mai usato, piuttosto che concentrarmi sulla soluzione ottima. Quando avrò un po' di tempo avevo già in programma di cambiare alcune cose (con una soluzione tra l'altro simile a quella che proponi).
La questione credo che sia piuttosto dare degli strumenti per sperimentare, lasciando spazio di miglioramento per raffinazioni successive.  :-)

Offline Max

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Ace
Re:Listview---> Dettaglio ---> swipe dettaglio
« Risposta #13 il: 09 Ottobre 2012, 13:50:50 CEST »
0
continuo ad avere problemi nel capire in primis l'utilizzo di quest'ultima soluzione, visto che al RUN compare solo un textview con hello world

Offline Phate

  • Utente junior
  • **
  • Post: 123
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S
  • Sistema operativo:
    Windows 7
Re:Listview---> Dettaglio ---> swipe dettaglio
« Risposta #14 il: 09 Ottobre 2012, 16:47:11 CEST »
0
Si ma il punto è che se anche lui come me permette fino a 100 elementi in lista alcuni cell piccoli crashano proprio perché potrebbe finire la memoria!XD (e se la pubblica sul playstore alcuni utenti lo manderanno cmq a quel paese perché vedranno picchi di memoria o un cell lento)...cioè una cosa è fare le cose con margini di ottimizzazione e un altra fare le cose una schifezza, cmq la viewflip è ottima e va provata ma sto scenario qui non è adattissimo, a meno che non si abbiano solo 5-6 elementi in lista.

Hai provato a fare lo swipe sia a destra che a sinistra? Cioè non succede proprio nulla una volta che avvii l'esempio?
Lo stai testando sul dispositivo o sull'emulatore?
Prova inoltre a mettere delle System.out nelle sezioni "right to left" e "left to right" per vedere se almeno l'evento lo riceve.
Codice (Java): [Seleziona]
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                System.out.println("ok da sinistra a destra va!;D");
                startActivity(intent);
                MainActivity.this.overridePendingTransition(
                        R.anim.slide_in_right,
                        R.anim.slide_out_left
                );
            // right to left swipe
            }  else
« Ultima modifica: 09 Ottobre 2012, 16:52:02 CEST da Phate »