Autore Topic: Albero a n livelli  (Letto 2581 volte)

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Albero a n livelli
« il: 12 Giugno 2012, 03:00:04 CEST »
+1
Mi è capitato di dover visualizzare una lista di dati a più livelli (Stile esplora risorse di Windows per intenderci). Leggendo in giro ho visto che le liste possibili mi pare si fermino al terzo livello. Pacioccando un po' ho messo su una cosa del genere. Il codice (api level 7) con un'activity d'esempio  è qui (src e res): mancano molti controlli su incongruenze nell'utilizzo, non è stato testato in tutti i possibili casi ma sembrerebbe funzionare.
N.B. Non estende un qualche Adapter quindi è inutilizzabile dentro spinner e similari. 
Cosa contiene:
1 Una classe per l'albero (Tree).
2 Una classe per la visualizzazione (TreeView). 
3 Un layout per l'intero albero(treeview_layout).
4 Un layout di default per i nodi non terminali(node_default_layout).
5 Un layout di default per i nodi terminali (leaf_default_layout).
6 Una classe astratta(CustomNodeRow) da estendere ed implementarne un metodo(fillCustomNodeRow) nel caso di layout personalizzato per un nodo non terminale.
7 Una classe astratta(CustomLeafRow) da estendere ed implementarne un metodo(fillCustomLeafRow) nel caso di layout personalizzato per un nodo terminale.
8 Un attrs per gli attributi personalizzabili del TreeView.
9 Uno styles per gli attributi di default.

Una breve spiegazioni dei componenti:
1 La classe usa i generics per poter essere  utilizzata con propri oggetti. E' necessario che il nodo radice venga impostato (con il metodo relativo) a livello 0. Si aggiungano alla radice i vari figli e ai figli i loro figli etc. etc. Tutti i nodi sono dello stesso tipo e nel costruttore si indica con un parametro boolean se è un nodo terminale (foglia). Nell'activity c'è, commentato, l'utilizzo con Integer, ed attivo l'utilizzo con una classe d'esempio creata allo scopo.
2 Estende LinearLayout ed ha le seguenti possibilità di personalizzazione tramite xml e/o codice: icona per nodo non terminale chiuso, icona per nodo non terminale aperto,icona per le foglie, layout delle foglie, layout dei nodi non terminali, mostare o non mostare (con icona personalizzabile) le icone per edit,delete ed add, padding a sinistra dei nodi non terminali figli rispetto al padre, padding a sinistra fra le varie icone di edit,cancel e add. Alcune personalizzazione (i layout di foglie e nodi non terminali personalizzati) richiedono sia interventi sull'xml sia sul codice. In particolare  oltre ad indicare nell'xml il/i proprio/i layout bisogna estendere una o tutte e due le classi indicate ai punti 6 ed 7 per visualizzare i propri dati. Nel caso non si effettuino personalizzazioni viene mostrato il toString del generico oggetto contenente il dato (nell'esempio c'è un layout personalizzato per i nodi non terminali). Ha tre listener impostabili per  edit delete ed add (nell'esempio sono implementati l'add e il delete). I listener passano il nodo; con il metodo getData si prelevano i propri dati ed eventualmente necessiti si opera un cast alla loro classe
3 Un semplice LinearLayout verticale (per l'albero) inserito in una ScrollView
4 e 5 Sono uguali: LinearLayout con dentro una TextView per mostrare il toString dell'oggetto da visualizzare
8 I nomi da utilizzare nell'xml per le personalizzazioni: closedNodeClickIcon, openedNodeClickIcon, leafIcon, iconsLeftPadding, nodesLeftPadding,  editIcon, deleteIcon, addIcon tutti integer;leafLayout, nodeLayout sono reference (il classico @layout/nomelayoutpersonale); editable, erasable, appendable sono boolean per indicare la possibilità delle relative operazioni.
9 I valori di default degli attributi personalizzabili; le icone sono prese da quelle standard di android presenti nell'sdk (prese dal 15)  e rinominate; i padding fra icone e fra padre e figlio sono a 30 (non sono dimension ma numeri puri in pixel).






Odio l'inglese e per un informatico non è il massimo

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:Albero a n livelli
« Risposta #1 il: 15 Giugno 2012, 13:06:36 CEST »
0
Aggiunte nuove funzionalità (la nuova versione è qui):
Non è più necessario un nodo di primo livello. Tramite i metodi addData si possono aggiungere più alberi che compariranno tutti al primo livello senza necessità di utilizzare il setMyLevel.
Tramite la classe TreeFactory è possibile costruire gli alberi a partire da un' HashMap<T,T> dove le chiavi con valori null rappresentano radici di alberi mentre chiavi con valori non nulli sono figli (il valore è una delle chiavi). Tramite i metodi setData si aggiunge la lista prodotta dal TreeFactory al TreeView che la visualizzerà.
Possibilità di non avere icona per le foglie.
Un nuovo evento generico con propria icona sia su nodi che su foglie.
Un nuovo evento generico cliccando direttamente sui dati mostrati (stile spinner). Solo uno dei due eventi generici può essere attivo.
Possibilità di header e footer sia come semplici stringhe che con layout personalizzati.
Aggiungere un nodo a uno degli alberi lo si fa inserendo il nuovo nodo nel nodo passato nel listener  mentre per aggiungere un nodo che inizia un nuovo albero lo si fa aggiungendo il nuovo nodo direttamente nella TreeView.
Si possono ottenere effetti dallo spartano come questo al barocco spinto come questo


« Ultima modifica: 15 Giugno 2012, 17:14:14 CEST da pivoide »
Odio l'inglese e per un informatico non è il massimo