2016-06-17 30 views
6

Ho creato un array, che quindi carico in una HashMap, che poi utilizzo in ExpandableListView. Tuttavia, mi piacerebbe avere parti dei dati visualizzati con pedice e apice per esponenti. Dopo molto googling, la soluzione per apice e pedice questo sembra essere utilizzando qualcosa di simile:Posso convertire un Spannable in una stringa in Android per caricare un ExpandableListView?

text.setText(Html.fromHtml(getString(R.string.acceleration))) 

per formattare utilizzando HTML nell'oggetto stringa memorizzata nei riferimenti. Tuttavia, questo è fatto per funzionare con TextView o pulsanti, e non un ListView. Il problema è che ora mi rendo conto che questo crea un oggetto Spannable, di cui ho poca conoscenza, ma capisco che non è una stringa e quindi non posso semplicemente aggiungerlo alla fine di una stringa nel mio array come Speravo di farlo. La mia matrice è simile al seguente:

constant_common_data = new ListViewItem[] 
      { 
        new ListViewItem(R.drawable.star, "Atomic Mass Constant ", "1.660 539 040 e-27", "kg", "0.000 000 020 e-27"), 
        new ListViewItem(R.drawable.star, "Avogadro Constant", "6.022 140 857 e23"," mol^-1", "0.000 000 074 x e23"), 
        new ListViewItem(R.drawable.star, "Boltzmann Constant", "1.380 648 52 e-23", "K^-1", "0.000 000 79 e-23"), 
        new ListViewItem(R.drawable.star, "Conductance Quantum", "7.748 091 7310 e-5", "s","0.000 000 0018 e-5"), 
        new ListViewItem(R.drawable.star, "Electric Constant", "8.854 187 817... e-12", "F m^-1", "(exact)"), 

        new ListViewItem(R.drawable.star, "Electron mass", "9.109 383 56 e-31", "kg", "0.000 000 11 e-31"), 
        new ListViewItem(R.drawable.star, "Electron volt", "1.602 176 6208 e-19"," J", "0.000 000 0098 e-19"), 
        new ListViewItem(R.drawable.star, "Elementary charge ", "1.602 176 6208 e-19", "C", "0.000 000 0098 e-19"), 
        new ListViewItem(R.drawable.star, "Faraday constant ", "96 485.332 89 e-5", "C mol^-1", "0.000 59"), 
        new ListViewItem(R.drawable.star, "Fine-structure constant ", "7.297 352 5664 e-3", " ", "0.000 000 0017 e-3"), 

        new ListViewItem(R.drawable.star, "Inverse fine-structure constant", "137.035 999 139", " ", "0.000 000 031"), 
        new ListViewItem(R.drawable.star, "Magnetic constant", "4pi e-7 = 12.566 370 614... e-7"," N A^-2", "(exact)"), 
        new ListViewItem(R.drawable.star, "Magnetic Flux Quantum", "2.067 833 831 e-15", "Wb", "0.000 000 013 e-15"), 
        new ListViewItem(R.drawable.star, "Molar Gas constant", "8.314 4598", "J mol^-1 K^-1", "0.000 0048"), 
        new ListViewItem(R.drawable.star, "Newtonian constant of gravitation ", "6.674 08 e-11", "m^3 kg^-1 s^-2", "0.000 31 e-11"), 

        new ListViewItem(R.drawable.star, "Planck constant", "6.626 070 040 e-34", "J s", "0.000 000 081 e-34"), 
        new ListViewItem(R.drawable.star, "Planck constant over 2 pi", "1.054 571 800 e-34"," J s", "0.000 000 013 e-34"), 
        new ListViewItem(R.drawable.star, "Proton Mass", "1.672 621 898 e-27", "kg", "0.000 000 021 e-27"), 
        new ListViewItem(R.drawable.star, "Proton-Electron Mass Ratio", "1836.152 673 89", " ", "0.000 000 17"), 
        new ListViewItem(R.drawable.star, "Rydberg constant", "10 973 731.568 508", "m^-1", "0.000 065"), 

        new ListViewItem(R.drawable.star, "Speed of Light in Vacuum", "299 792 458", "m s^-1", "(exact)"), 
        new ListViewItem(R.drawable.star, "Stefan-Boltzmann constant", "5.670 367 e-8", "Wm^-2 K^-4", "0.000 013 e-8"), 

        new ListViewItem(R.drawable.star, "Bohr Radius", "0.529 177 210 67 e-10", "m", "0.000 000 000 12 e-10"), 
        new ListViewItem(R.drawable.star, "Bohr Magneton ", "927.400 9994 e-26"," J T^-1", "0.000 0057 e-26"), 
        new ListViewItem(R.drawable.star, "Josephson constant", "483 597.8525 e9", "Hz V^-1", "0.0030 e9"), 
        new ListViewItem(R.drawable.star, "Von Klitzing constant", "25 812.807 4555", "Ohm", "0.000 0059"), 
        new ListViewItem(R.drawable.star, "Unified Atomic Mass Unit", "1.660 539 040 e-27"+ test , "kg", "0.000 000 020 e-27") 
      };} 

Si può vedere ogni ListViewItem prende le stringhe come parametri, e poi più tardi, dopo tutto quello che è stato caricato nella lista, chiamo il metodo toString della classe ListViewItem mostrato qui:

public String toString() { 
     return "Value: " + this.value + "\nUnits: " + this.unit + "\nStandard Uncertainty: " + this.uncertainty; 
    } 

da visualizzare nella parte a discesa di ExpandableListView. Voglio che i parametri che sto inserendo in ListViewItem possano essere stampati in questo modo, ma voglio anche che siano formattati con sub e super script.

La mia domanda è, c'è un modo per convertire un oggetto Spannable in una stringa, quindi posso includerlo in un parametro String e avere l'oggetto restituirlo, ancora in stile, nel suo metodo toString()?

Grazie, apprezzo tutto l'aiuto.

+0

Si sta utilizzando un adattatore di elenco personalizzato con layout personalizzati per gli elementi dell'elenco? In caso contrario, questa è la soluzione semplice. Dovresti solo definire una voce di elenco personalizzata che ti consente di visualizzare qualsiasi elemento grafico speciale desideri nella voce dell'elenco. Non vuoi usare cose come 'ArrayAdapter' in quanto consente solo un singolo elemento di testo. – NoChinDeluxe

+0

Bene se hai già un 'BaseAdapter' personalizzato o qualcosa di simile, questo dovrebbe essere abbastanza semplice e non dovrebbe richiedere molto lavoro extra. Se non sei sicuro di come farlo, sentiti libero di inserire il codice dell'adattatore e darò un'occhiata e forse ti indirizzerò nella giusta direzione. – NoChinDeluxe

risposta

4

Dopo aver cercato un sacco, ho trovato la seguente soluzione:

In primo luogo, per convertire un Spannable a un oggetto String, ho usato:

Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY); 

Questo metodo restituirà un Spannable (ovviamente) e qui si può utilizzare toString() metodo per generare il vostro String:

String yourString = Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY).toString(); 

Se avete bisogno di co nvert un HTML-String (rimuovere i tag), è possibile utilizzare questa soluzione:

public String stripHtml(String html) { 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { 
      return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY); 
     } else { 
      return Html.fromHtml(html); 
     } 

} 
3

Se si cambia ListViewItem costruttore di prendere un argomento CharSequence invece di String quindi è possibile utilizzare un String o un Spanned (il risultato di .fromHtml()) poiché entrambi si estendono CharSequence.

+0

la domanda riguarda la conversione di uno Spannable in una stringa, non la modifica del costruttore. Non voglio usare CharSequence, solo stringhe. –

+0

ma la conversione in String non manterrà la formattazione - String non mantiene gli Span – LukeJanyga

2

È possibile utilizzare il metodo statico toHtml() nella classe Html, sebbene possa gestire solo alcuni output HTML, non cose arbitrarie. Inoltre, è possibile utilizzare uno SpannableStringBuilder per fare le modifiche:

String photoHeading = mContext.getString(R.string.photo_heading); 
     SpannableStringBuilder builder = new SpannableStringBuilder(photoHeading); 

Si potrebbe anche avere un ArrayList che detiene la Spannable piuttosto che una conversione String di quel Spannable.