Android: Как добавить HTML-ссылки внутри ListView?

Как мне добавить добавление интерактивных ссылок внутри 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();