0

我有带有textvies的recyclerviwq,textview中的文本有urlss,我想在textview上设置clickablespan并捕获url。

我正在使用这个公认的答案,但它不起作用。

这是我的代码:

    public class LibAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context mContext;
    private List<LibItem> mLibItemList;

    private final int HEAD_VIEW = 0;
    private final int LIB_VIEW = 1;

    public LibAdapter(List<LibItem> libItems, Context context) {
        super();
        this.mLibItemList = libItems;
        this.mContext = context;
    }

    @Override
    public int getItemViewType(int position) {
        if (isPositionItem(position)) {
            return HEAD_VIEW;
        }
        return LIB_VIEW;
    }

    private boolean isPositionItem(int position) {
        return position == 0;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == LIB_VIEW) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.library_item, parent, false);
            return new LibHolder(view);
        } else  if (viewType == HEAD_VIEW) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.about_hedaer, parent, false);
            return  new HeadHolder(view);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof LibHolder) {
            final LibItem libItem = mLibItemList.get(position);
            ((LibHolder) holder).libName.setText(libItem.getLibName());
            ((LibHolder) holder).libCopy.setText(Html.fromHtml(libItem.getLibCopy()));
            ((LibHolder) holder).libLic.setText(mContext.getString(R.string.proj_license));

            setTextViewHTML(((LibHolder) holder).libWeb, mContext.getString(R.string.proj_code, libItem.getLibWebs()));
            ((LibHolder) holder).libLic.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("LibAdapter", "License of " + libItem.getLibName() + "clicked");
                }
            });
        } else if (holder instanceof HeadHolder){
            String versionCode = BuildConfig.VERSION_NAME;
            ((HeadHolder) holder).abtVersion.setText(mContext.getString(R.string.app_version, versionCode));
        }
    }

    protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
    {
        int start = strBuilder.getSpanStart(span);
        int end = strBuilder.getSpanEnd(span);
        int flags = strBuilder.getSpanFlags(span);
        ClickableSpan clickable = new ClickableSpan() {
            public void onClick(View view) {
                Log.d("LipAdapter", span.getURL());
            }
        };
        strBuilder.setSpan(clickable, start, end, flags);
        strBuilder.removeSpan(span);
    }

    protected void setTextViewHTML(TextView text, String html)
    {
        CharSequence sequence = Html.fromHtml(html);
        SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
        URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);
        for(URLSpan span : urls) {
            makeLinkClickable(strBuilder, span);
        }
        text.setText(strBuilder);
        text.setMovementMethod(LinkMovementMethod.getInstance());
    }



    @Override
    public int getItemCount() {
        return mLibItemList.size();
    }

    public class LibHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.lib_name) TextView libName;
        @BindView(R.id.lib_website) TextView libWeb;
        @BindView(R.id.lib_copyright) TextView libCopy;
        @BindView(R.id.lib_license) TextView libLic;

        public LibHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    public class  HeadHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.abt_version) TextView abtVersion;

        public HeadHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }
}

文本设置得很好,但链接拒绝被点击。请问您有解决方案吗?

4

2 回答 2

2

你在尝试这个::

  protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
{
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);
    ClickableSpan clickable = new ClickableSpan() {
        public void onClick(View view) {
            Log.d("LipAdapter", span.getURL());
        }
    };
    strBuilder.setSpan(clickable, start, end, flags);
    strBuilder.removeSpan(span);
}

但是你需要做这样的事情::

protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
{
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);


    ClickableSpan clickable = new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            Log.d("LipAdapter", span.getURL());
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
        }
    };

    strBuilder.setSpan(clickable, start, end, flags);
    strBuilder.removeSpan(span);
}

希望它对其他人有用

于 2016-10-12T12:44:11.953 回答
0

我遇到了同样的问题,必须进行类型sequence转换才能Spannable使其正常工作。

只需更换

SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);

Spannable strBuilder = (Spannable) sequence;
于 2018-03-06T14:26:19.180 回答