Autore Topic: Font personalizzato negli elementi di una ListView  (Letto 752 volte)

Offline kiros

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
    • StefanoFibbi
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7
Font personalizzato negli elementi di una ListView
« il: 27 Gennaio 2013, 13:16:10 CET »
0
Ciao a tutti, sto sviluppando un'app ed ho un problema con il setting di un font esterno. Provo a spiegarvi in due parole la situazione in cui mi trovo:

Nell'activity principale ho una ListView che visualizza un certo numero di elementi. Ogni elemento della ListView è un LinearLayout che contiene diverse TextView. Ho impostato il layout con un "custom adapter" e visualizzo tutto senza nessun problema, però non riesco ad impostare il font esterno come font delle TextView.

Ho provato a farlo da dentro l'adapter, ma non è definito il metodo getAssets e quindi non lo si può fare li. Non posso fare riferimento diretto alla TextView usando l'ID perchè è, ovviamente, lo stesso ID per ogni item della ListView. Ho pensato ad esaminare ogni elemento presente all'interno dell'activity, ma non ho idea di come fare.

Qualcuno si è già scontrato con un problema di questo tipo e sa come poterlo risolvere? :D


Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Font personalizzato negli elementi di una ListView
« Risposta #1 il: 29 Gennaio 2013, 21:48:51 CET »
0
Ciao io no ho capito bene il tuo problema ma puoi differenziare gli elementi della tua listview non grazie all'ID ma alla posizione degli elementi all'interno della lista..
prova a spiegare meglio cosa devi fare e magari posta il codice

Offline kiros

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
    • StefanoFibbi
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7
Re:Font personalizzato negli elementi di una ListView
« Risposta #2 il: 30 Gennaio 2013, 08:49:23 CET »
0
ok, provo a spiegarmi meglio :)
Dunque, ho una ListView ed ogni item di questa ha questa struttura (anteprima.xml):
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"
   android:background="@drawable/anteprima_nota"
   android:paddingBottom="10dp" android:paddingLeft="10dp"
   android:focusable="false" >
   
    <!-- Titolo nota e Rating -->

    <LinearLayout
       android:layout_width="0dip"
       android:layout_height="wrap_content"
       android:layout_weight=".5"
       android:orientation="vertical" >
       
        <!-- Titolo -->
        <TextView
           android:id="@+id/textviewTitoloNota"
           android:layout_width="match_parent" android:layout_height="wrap_content"
           style="@style/testoTitoloNota" />
       
               

        <RatingBar
           android:id="@+id/ratingbarPunteggioNota"
           style="@style/anteprimaRatingBar"
           android:scrollbarAlwaysDrawVerticalTrack="false" />
    </LinearLayout>
   
   
    <!-- Timestamp -->

    <TextView
       android:id="@+id/textviewTimestampNota"
       style="@style/testoTitoloNota"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:gravity="center_horizontal"
       android:layout_gravity="center_vertical"/>

</LinearLayout>

Ogni elemento della ListView corrisponde un oggetto che appartiene ad una lista (MainActivity.java):
Codice (Java): [Seleziona]
List<Nota> lista;
La ListView deve contenere gli elementi della lista, e questi devono essere visualizzati con il layout anteprima.xml scritto sopra.
Per l'adapter ho scritto questo codice (Adapter.java):
Codice (Java): [Seleziona]
public class NotaAdapter extends ArrayAdapter<Nota> {
        private List<Nota> items;
       
        // Costruttore
        public NotaAdapter(Context context, int idRes, List<Nota> items){
                super(context, idRes, items);
                this.items = items;
        }
       
       
        // Override getView
        public View getView(int position, View convertView, ViewGroup parent){
               
                // Variabile d'appoggio
                View v = convertView;
               
                // Controllo se è null
                if(v == null){
                        LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        v = inflater.inflate(R.layout.anteprima, null);
                }
               
                // Recupero la nota
                Nota n = this.items.get(position);
               
                // Se non è null, imposto tutto
                if(n != null){
                        ViewNota holder = new ViewNota();
                       
                        // Recupero gli elementi
                        holder.rating = (RatingBar) v.findViewById(R.id.ratingbarPunteggioNota);
                        holder.titolo = (TextView) v.findViewById(R.id.textviewTitoloNota);
                        holder.timestamp = (TextView) v.findViewById(R.id.textviewTimestampNota);
                       
                       
                        // Se ho trovato gli elementi, imposto i valori corretti
                        if(holder.rating != null){
                                ...
                        }
                       
                        if(holder.titolo != null){
                                ...
                        }
                       
                        if(holder.timestamp != null){
                                ...
                        }
                }
               
                return v;
        }
       

        // Classe di appoggio contenente gli elementi del layout della nota
        private class ViewNota{
                public TextView titolo;
                public TextView timestamp;
                public RatingBar rating;
        }
}

Ok, questa è la situazione in cui mi trovo: ho la ListView, con l'adapter ne imposto ogni elemento e grazie al layoutInflater do ad ogni item il layout che ho pensato. Funziona tutto bene, ma non riesco a cambiare il font.
Quel che faccio normalmente, per cambiare il testo, è usare questa funzione:
Codice (Java): [Seleziona]
        public void setFont(TextView tv){
                // Definisco il font
                Typeface tf = Typeface.createFromAsset(getAssets(), MainActivity.FontPath);
               
                // Imposto il font alla TextView
                tv.setTypeface(tf);
        }
dove FontPath è un attributo "static final String" di MainActivity.

Dove sta il problema? E' semplice, nella schermata in cui ho la ListView, ogni item ha il font di android, nelle altre, il font scelto da me. Questa funzione da errori se messa dentro la classe dell'adapter e da MainActivity posso accedere non alla TextView ma al valore che contiene, perchè l'oggetto non contiene TextView ma String.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Font personalizzato negli elementi di una ListView
« Risposta #3 il: 30 Gennaio 2013, 10:40:59 CET »
+1
Ma se fai semplicemente in questo modo?

Codice (Java): [Seleziona]
public class NotaAdapter extends ArrayAdapter<Nota> {
        private List<Nota> items;
        private Context context;

        // Costruttore
        public NotaAdapter(Context context, int idRes, List<Nota> items){
                super(context, idRes, items);
                this.items = items;
                this.context = context;
        }
       
       
        // Override getView
        public View getView(int position, View convertView, ViewGroup parent){
               
                // Variabile d'appoggio
                View v = convertView;
               
                // Controllo se è null
                if(v == null){
                        LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        v = inflater.inflate(R.layout.anteprima, null);
                }
               
                // Recupero la nota
                Nota n = this.items.get(position);
               
                // Se non è null, imposto tutto
                if(n != null){
                        ViewNota holder = new ViewNota();
                       
                        // Recupero gli elementi
                        holder.rating = (RatingBar) v.findViewById(R.id.ratingbarPunteggioNota);
                        holder.titolo = (TextView) v.findViewById(R.id.textviewTitoloNota);
                        holder.timestamp = (TextView) v.findViewById(R.id.textviewTimestampNota);
                       
                        setFont(holder.titolo);
                        setFont(holder.timestamp);
                       
                        // Se ho trovato gli elementi, imposto i valori corretti
                        if(holder.rating != null){
                                ...
                        }
                       
                        if(holder.titolo != null){
                                ...
                        }
                       
                        if(holder.timestamp != null){
                                ...
                        }
                }
               
                return v;
        }

        public void setFont(TextView tv){
                // Definisco il font
                Typeface tf = Typeface.createFromAsset(context.getAssets(), MainActivity.FontPath);
               
                // Imposto il font alla TextView
                tv.setTypeface(tf);
        }
       

        // Classe di appoggio contenente gli elementi del layout della nota
        private class ViewNota{
                public TextView titolo;
                public TextView timestamp;
                public RatingBar rating;
        }
}

Offline kiros

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
    • StefanoFibbi
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7
Re:Font personalizzato negli elementi di una ListView
« Risposta #4 il: 30 Gennaio 2013, 10:52:16 CET »
0
Se faccio in questo modo scopro quanto sono capra! XD
Facendo così funziona ... non avevo pensato di mettere anche context come attributo ed usare getAssets() tramite questo, grazie mille per l'aiuto :D