Come fare per aggiungere collegamenti cliccabili all'interno di un ListView?Android: come posso aggiungere collegamenti HTML all'interno di un ListView?
risposta
Questo viene eseguito utilizzando l'attributo autoLink di un TextView. Mi ci è voluto un po 'di tempo per esaminare la documentazione, inserendola qui con un esempio nel caso in cui qualcun altro la stia cercando:
Supponiamo che tu leghi la tua listview ad un adattatore personalizzato. In tal caso, il seguente pezzo di codice va nella vostra chiamata GetView:
Codice:
textcontent.setText(Html.fromHtml(item.get_text()));
textcontent.setAutoLinkMask(Linkify.WEB_URLS);
Basta mettere il link all'interno del testo viene passato alla chiamata setText e il gioco è fatto.
XML:
<TextView
android:id="@+id/txtview"
android:autoLink="web"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="put your link here"/>
Speranza che aiuta ...
Se hai testo che è già in formato HTML, la cosa migliore da fare è il seguente:
TextView textcontent = (TextView) findViewById(...);
textcontent.setMovementMethod(LinkMovementMethod.getInstance());
String text = "<a href="http://www.stackoverflow.com">stackoverflow.com</a>";
textcontent.setText(Html.fromHtml(text));
Ciò farà sì che i tag di collegamento siano selezionabili nella visualizzazione del testo. In alternativa, è possibile utilizzare android:autoLink="web"
come suggerito da Legend, ma questo ha l'effetto collaterale di a) collegando gli URL che non sono racchiusi tra tag di ancoraggio e b) potenzialmente mancanti URL o che collegano elementi che non sono URL. Se vuoi l'intelligenza di autoLink, dovresti usarlo, ma se tutto quello che vuoi è collegare i tag che ci sono già, è meglio usare setMovementMethod()
.
Vai a questa segnalazione di bug per maggiori dettagli: http://code.google.com/p/android/issues/detail?id=2219
Grazie, ha funzionato alla grande. –
Hmm, sembra che aggiunga textcontent.setMovementMethod (LinkMovementMethod.getInstance()); fa in modo che i clic sulle parti di testo della textview non vengano più passati alla vista elenco qui sotto. –
Questa è la risposta più corretta alla domanda posta. Le risposte di BeerMe risolvono i problemi con l'oggetto ListView diventando non modificabile. – juil
Hmm, sembra che l'aggiunta di textcontent.setMovementMethod (LinkMovementMethod.getInstance()); fa in modo che i clic sulle parti di testo della textview non vengano più passati alla vista elenco qui sotto.
ho trovato una soluzione semplice sotto Issue 3414, Comment 27:
Un modo semplice per ovviare a questo problema è quello di chiamare "setDescendantFocusability (FOCUS_BLOCK_DESCENDANTS);" sulla listaVisualizza le viste man mano che vengono aggiunte. Sarai in grado di selezionare le righe, fare clic sulle righe e fare clic su caselle e pulsanti secondari.
ha funzionato perfettamente per me, anche se alcuni di fusione è stato richiesto:
View v;
((ViewGroup)v).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
Dove si aggiunge la predisposizione alla messa a fuoco? Al ListView o al ListItem? Ho seguito il tuo esempio per aggiungere link cliccabili, tuttavia quando clicco su parti non link della mia textview, l'evento non viene passato alla vista genitore del listitem o alla listview ... – ffleandro
Io lo uso in questo modo: pubblico Visualizza getView (int position, Visualizza convertView, ViewGroup parent) { Visualizza v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate (itemLayout, null); } ... ((ViewGroup) v). SetDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); return v; } Non ho controllato per vedere cosa succede all'evento se si fa clic su una porzione non collegata. (Non sono sicuro del motivo per cui non riesco a ottenere il codice da formattare ... mi dispiace.) –
È necessario impostare una funzione setOnItemClickListener() e al suo interno dichiarare qualcosa di simile:
Uri uri = Uri.parse("http://www.google.com");
startActivity(new Intent(Intent.ACTION_VIEW, uri));
Il la parte difficile di listview non è nulla all'interno (ad esempio un TextView di un pulsante) è cliccabile!
Fondamentalmente è necessario due array di stringhe:
- nomi che gli utenti vedono sul list_view;
- collegamenti ipertestuali che si desidera indirizzarli.
Nella array.xml:
<string-array name="search_provider_name_array">
<item>Google</item>
<item>Yahoo</item>
<item>Bing</item>
<item>Baidu</item>
</string-array>
<string-array name="search_provider_link_array">
<item>https://www.google.com</item>
<item>https://www.yahoo.com</item>
<item>https://www.bing.com</item>
<item>https://www.baidu.com</item>
</string-array>
Nel layout_search_provider.xml essa contiene una vista elenco:
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lv_search"
android:dividerHeight="1dp"/>
Nella vostra attività:
public class SearchProvider implements AdapterView.OnItemClickListener {
private ListView lv_search;
private String[] names = getResources().getStringArray(R.array.search_provider_name_array);
private String[] links = getResources().getStringArray(R.array.search_provider_link_array);
//..
@Override
public View onCreateView(View v, String name, Context context, AttributeSet attrs) {
lv_search= (ListView) v.findViewById(R.id.lv_search);
ArrayAdapter sAdapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, names);
lv_search.setAdapter(sAdapter);
lv_search.setOnItemClickListener(this);
return v;
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if(i<links.length){
Uri uri = Uri.parse(links[i]);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
}
}
Quando il l'elenco è dinamico, è possibile il seguente metodo (s) per aggiornare il listview.
- spostare il codice in onCreateView() in onResume().
- sAdapter.notifyDataSetChanged();
Questo in realtà non ha funzionato per me: i singoli collegamenti sono rimasti invalicabili in elementi presenti in ListView, ma la soluzione di emmby ha funzionato benissimo. –
Grazie mille, aiutato con il mio ListView. – rwarner