Элемент ListView не щелкает

У меня есть фрагмент с ListView. Проблема с ListViewItem, имеющим ссылки web-html. Не кликабельно. @drawable/items_selector не работает, и onItemClick не вызывается, когда android:autoLink="web" "android:descendantFocusability="blocksDescendants" не помогает. И это решение не работает. Мне нужен элемент списка, например "тусовки" или другие приложения с выбранным рабочим элементом рабочие html-ссылки и т. д. Помогите, пожалуйста. Версия ОС: Android 5.1.1

введите здесь описание изображения

ПРОСТОЙ XML... Но тоже не работает.

 <LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:descendantFocusability="blocksDescendants" 
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="@drawable/items_selector"
  android:orientation="vertical"
  android:padding="2dp">

<TextView
    android:id="@+id/themeText"
    android:autoLink="web"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="@dimen/layout_margin"
    android:paddingLeft="@dimen/layout_margin"
    android:paddingRight="@dimen/layout_margin"
    android:text="Bla bla bla"/>

</LinearLayout>

Код адаптера:

 private class ThemesAdapter extends BaseAdapter {
    private LayoutInflater layoutInflater;
    private ArrayList<ForumThemeItem> mThemes;

    public ThemesAdapter(Context context, ArrayList<ForumThemeItem> themes) {
        this.mThemes = themes;
        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        if (mThemes != null) {
            return mThemes.size();
        }
        return 0;
    }

    public void add(ArrayList<ForumThemeItem> themes){
        mThemes.addAll(themes);
    }

    public ForumThemeItem getItem(int position) {
        return mThemes.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ForumThemeItem mTheme = getItem(position);
        ThemesViewHolder viewHolder;

        if (convertView == null) {
            viewHolder = new ThemesViewHolder();
            convertView = layoutInflater.inflate(R.layout.item_theme, null);
            convertView.findViewById(R.id.ratingLayout).setVisibility(View.GONE);
            viewHolder.themePart = (TextView)convertView.findViewById(R.id.themePart);
            viewHolder.themeText = (TextView)convertView.findViewById(R.id.themeText);
            viewHolder.themeDate = (TextView)convertView.findViewById(R.id.themeDate);
            viewHolder.themeDateUpdate = (TextView)convertView.findViewById(R.id.themeDateUpdate);
            viewHolder.userNick = (TextView)convertView.findViewById(R.id.userNick);
            viewHolder.vote = (ImageView)convertView.findViewById(R.id.vote);
            viewHolder.viewsCount =(TextView)convertView.findViewById(R.id.viewsCount);
            viewHolder.replyCount =(TextView)convertView.findViewById(R.id.replyCount);
            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ThemesViewHolder) convertView.getTag();
        }


        viewHolder.vote.setVisibility(mTheme.isVote() ? View.VISIBLE : View.GONE);
        viewHolder.themeText.setText(Html.fromHtml(mTheme.getText()));
        viewHolder.userNick.setText(mTheme.getNick());
        viewHolder.themeDate.setText(mTheme.getCreateDate()+",");
        viewHolder.themeDateUpdate.setText(String.format("обн.: %s",mTheme.getDateUpdate()));
        viewHolder.viewsCount.setText(String.format("%s",mTheme.getViewsCount()));
        viewHolder.replyCount.setText(String.format("%s", mTheme.getRepliesCount()));

        if(mTheme.getPartSubName()==null){
            viewHolder.themePart.setText(mTheme.getPartName());
        }else{
            viewHolder.themePart.setText(String.format("%s (%s)",mTheme.getPartName(),mTheme.getPartSubName()));
        }

        if(!mTheme.isAnonymously()){
            switch (mTheme.getGender()){
                case "f":
                    viewHolder.userNick.setTextColor(getResources().getColor(R.color.woman));
                    break;
                case "m":
                    viewHolder.userNick.setTextColor(getResources().getColor(R.color.man));
                    break;
                case "n":
                    viewHolder.userNick.setTextColor(getResources().getColor(R.color.it));
                    break;
            }
        }else{
            viewHolder.userNick.setTextColor(getResources().getColor(R.color.default_text_color));
        }

        return convertView;
    }

    class ThemesViewHolder {
        TextView themePart;
        TextView themeDate;
        TextView themeDateUpdate;
        TextView themeText;
        TextView userNick;
        ImageView vote;
        TextView viewsCount;
        TextView replyCount;
    }
}

Я модифицирую адаптер.

В адаптере:

  viewHolder.themeText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mTextClickListener!=null){
                    mTextClickListener.onTextClick(position);
                }
            }
        });

В действии:

@Override
public void onTextClick(int position) {
    mThemesList.performItemClick(mThemesList.getAdapter().getView(position, null, null), position, position);
}

Но элемент не выбран (без заливки серым цветом)

введите здесь описание изображения


person GPPSoft    schedule 04.06.2015    source источник
comment
Расширение вашего вопроса путем добавления кода (адаптера), возможно, может быть более полезным для решения проблемы.   -  person hrskrs    schedule 04.06.2015
comment
В порядке. Я добавляю адаптер кода.   -  person GPPSoft    schedule 04.06.2015
comment
Вам нужно настроить OnClickListener   -  person Jacques Krause    schedule 04.06.2015
comment
Вы хотите, чтобы нажимали только на вашу веб-ссылку или на всю ячейку списка??   -  person Maniya Joe    schedule 04.06.2015
comment
Мне нужно работать с интерактивными элементами (выбор) списка со ссылками clickabel. И открыть ссылку, когда нажмите на нее. Смотрите на картинку пожалуйста.   -  person GPPSoft    schedule 04.06.2015


Ответы (2)


Если вы хотите щелкнуть всю строку, просто реализуйте OnClickListener.

Если вы хотите щелкнуть всю строку и ссылки внутри строки (я думаю, это то, что вам нужно):

  • Вы должны создать custom row item
  • Создайте interface
  • Отправьте это interface listener в adapter
  • Проверьте, содержит ли текст ссылку. Если это так, используйте этот слушатель, чтобы отправить вас по ссылке

что-то вроде этого:

interface OnWebLinkClick(){
    void onWebLinkClick(String url);
}

на вашем адаптере вы добавляете еще один параметр для OnWebLinClick Listener:

public ThemesAdapter(Context context, ArrayList<ForumThemeItem> themes, OnWebLinClick mListener){
   this.mListener = mListener;   
} 

Проверьте, содержит ли текст ссылку, внедрите onWebLinkClick(urlOnTextView) и откройте его в webView.

person hrskrs    schedule 04.06.2015
comment
@GPPSoft вы можете использовать селектор - person hrskrs; 04.06.2015
comment
Я использую селектор для корневого макета. Но не работает. - person GPPSoft; 04.06.2015
comment
@GPPSoft попробуйте установить этот selector как background из each row вместо root layout(listview). - person hrskrs; 04.06.2015
comment
XML имеет android:background=@drawable/items_selector. Посмотрите в моем коде. Но не работает :( - person GPPSoft; 04.06.2015
comment
@GPPSoft, это еще один вопрос, и я тоже пытаюсь помочь в этом, добавьте этот селектор в каждую строку вместо listview - person hrskrs; 04.06.2015

Чтобы сделать html-ссылки TextView кликабельными, выполните следующие действия.

textView.setText(Html.fromHtml("your html text here"));

Если это элемент ListView - я подозреваю, что вам придется сделать это в ListAdapter - getView или эквивалентном методе.

Или вы можете обновить свой XML и добавить следующее: документы здесь

android:autoLink="web"
person Zain    schedule 04.06.2015
comment
Спасибо. Но ты меня не понимаешь. Мне нужно работать с интерактивными элементами списка со ссылками clickabel. onItemClick не вызывается, когда android:autoLink=web. - person GPPSoft; 04.06.2015