Как мне добавить добавление интерактивных ссылок внутри ListView?
Android: Как добавить HTML-ссылки внутри ListView?
Ответ 1
Это делается с использованием атрибута autoLink TextView. Понадобилось немного времени, чтобы прорвать документацию, поэтому приложите ее сюда, например, в случае, если кто-то ищет ее:
Предположим, что вы привязываете свой список к пользовательскому адаптеру. В этом случае в ваш вызов getView входит следующий фрагмент кода:
Код:
textcontent.setText(Html.fromHtml(item.get_text()));
textcontent.setAutoLinkMask(Linkify.WEB_URLS);
Просто поместите ссылку внутри текста, переданного на вызов setText, и все готово.
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"/>
Надеюсь, что это поможет...
Ответ 2
Если у вас есть текст, который уже находится в формате HTML, лучше всего сделать следующее:
TextView textcontent = (TextView) findViewById(...);
textcontent.setMovementMethod(LinkMovementMethod.getInstance());
String text = "<a href="http://www.stackoverflow.com">stackoverflow.com</a>";
textcontent.setText(Html.fromHtml(text));
Это приведет к тому, что любые теги ссылок будут доступны для просмотра в текстовом представлении. В качестве альтернативы вы можете использовать android:autoLink="web"
, как это было предложено Легендом, но это имеет побочный эффект: a) связывания URL-адресов, которые не завернуты в теги привязки, и b) потенциально отсутствующие URL-адреса или ссылки на вещи, которые не являются URL-адресами. Если вы хотите смайлики autoLink, тогда вы должны использовать его, но если все, что вам нужно, это связать теги, которые уже есть, вам лучше использовать setMovementMethod()
.
См. этот отчет об ошибках для получения дополнительной информации: http://code.google.com/p/android/issues/detail?id=2219
Ответ 3
Хмм, кажется, что добавление textcontent.setMovementMethod(LinkMovementMethod.getInstance()); делает так, что клики на текстовых частях textview больше не передаются в список ниже.
Я нашел простую обходную задачу в Проблема 3414, Комментарий 27:
Простым способом решения этой проблемы является вызов "setDescendantFocusability (FOCUS_BLOCK_DESCENDANTS);" в представлении listView по мере их добавления. Вы сможете выбрать строки, щелкнуть по строкам и щелкнуть дочерние флажки и кнопки.
Это отлично сработало для меня, хотя требуется некоторое литье:
View v;
((ViewGroup)v).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
Ответ 4
Вам нужно установить функцию setOnItemClickListener() и внутри нее объявить что-то вроде этого:
Uri uri = Uri.parse( "http://www.google.com" );
startActivity( new Intent( Intent.ACTION_VIEW, uri ) );
Ответ 5
Сложная часть списка не имеет ничего (например, TextView кнопки), можно щелкнуть!
В основном вам нужны два строковых массива:
- имена, которые пользователи видят в list_view;
- гиперссылки, на которые вы хотите направить их.
В файле 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>
В layout_search_provider.xml он содержит представление списка:
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lv_search"
android:dividerHeight="1dp"/>
В вашей деятельности:
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);
}
}
}
Когда ваш список является динамическим, вы можете использовать следующий метод для обновления списка.
- переместите код в onCreateView() в onResume().
- sAdapter.notifyDataSetChanged();