【问题标题】:Hyperlink in RecyclerView textviewRecyclerView 文本视图中的超链接
【发布时间】:2016-10-26 18:35:33
【问题描述】:

我正在从 JSON 中获取数据并在 RecyclerView 布局中显示。我的 textview 正在显示整个链接。例如,我的 TextView 已安装,链接为 http://mydomin.com?id=2054656。在 RecyclerView 中,它应该只显示 install 文本,当它被点击时,它应该转到 URL。我试过下面的代码。

Viewholder.ImageUrlNameView.setText(getDataAdapter1.getImageUrlName());

ImageUrlNameView = (TextView) itemView.findViewById(tvAppLink) ;

ImageUrlNameView.setMovementMethod(LinkMovementMethod.getInstance());

它工作正常,但显示的是整个链接而不是文本。希望你能理解。

请在将 textview 更改为按钮后查看我的完整代码

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;

import java.util.List;

import static android.icu.lang.UCharacter.GraphemeClusterBreak.V;



public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

    Context context;

    List<GetDataAdapter> getDataAdapter;

    ImageLoader imageLoader1;

    public RecyclerViewAdapter(List<GetDataAdapter> getDataAdapter, Context context){

        super();
        this.getDataAdapter = getDataAdapter;
        this.context = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_items, parent, false);

        ViewHolder viewHolder = new ViewHolder(v);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder Viewholder, int position) {

        GetDataAdapter getDataAdapter1 =  getDataAdapter.get(position);

        imageLoader1 = ServerImageParseAdapter.getInstance(context).getImageLoader();

        imageLoader1.get(getDataAdapter1.getImageServerUrl(),
                ImageLoader.getImageListener(
                        Viewholder.networkImageView,//Server Image
                        R.mipmap.ic_launcher,//Before loading server image the default showing image.
                        android.R.drawable.ic_dialog_alert //Error image if requested image dose not found on server.
                )
        );

        Viewholder.networkImageView.setImageUrl(getDataAdapter1.getImageServerUrl(), imageLoader1);

        Viewholder.ImageTitleNameView.setText(getDataAdapter1.getImageTitleName());

        Viewholder.ImageUrlNameView.setText(getDataAdapter1.getImageUrlName());

    }

    @Override
    public int getItemCount() {

        return getDataAdapter.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        public NetworkImageView networkImageView ;
        public TextView ImageTitleNameView;
        public Button ImageUrlNameView ;

        public ViewHolder(View itemView) {

            super(itemView);

            networkImageView = (NetworkImageView) itemView.findViewById(R.id.VollyNetworkImageView1) ;
            ImageTitleNameView = (TextView) itemView.findViewById(R.id.textView_item);
            //ImageUrlNameView = (Button) itemView.findViewById(R.id.bAppUrl) ;
            //ImageUrlNameView.setMovementMethod(LinkMovementMethod.getInstance());
            //Linkify.addLinks(ImageUrlNameView, Linkify.WEB_URLS);

            itemView.findViewById(R.id.bAppUrl).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String url = "ImageUrlNameView";

                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);
                }
            });


        }


    }

}

遇到错误

10-27 20:58:43.896 12462-12462/com.android_examples.recyclerviewimagelistview_android_examplescom E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                                                    java.lang.NullPointerException
                                                                                                                        at com.android_examples.recyclerviewimagelistview_android_examplescom.RecyclerViewAdapter.onBindViewHolder(RecyclerViewAdapter.java:73)
                                                                                                                        at com.android_examples.recyclerviewimagelistview_android_examplescom.RecyclerViewAdapter.onBindViewHolder(RecyclerViewAdapter.java:29)
                                                                                                                        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5768)
                                                                                                                        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5801)
                                                                                                                        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5037)
                                                                                                                        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4913)
                                                                                                                        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2029)
                                                                                                                        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1414)
                                                                                                                        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1377)
                                                                                                                        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:578)
                                                                                                                        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3260)
                                                                                                                        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3069)
                                                                                                                        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3518)
                                                                                                                        at android.view.View.layout(View.java:14008)
                                                                                                                        at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                                                                        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1021)
                                                                                                                        at android.view.View.layout(View.java:14008)
                                                                                                                        at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                                                                        at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
                                                                                                                        at android.view.View.layout(View.java:14008)
                                                                                                                        at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                                                                        at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:435)
                                                                                                                        at android.view.View.layout(View.java:14008)
                                                                                                                        at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                                                                        at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
                                                                                                                        at android.view.View.layout(View.java:14008)
                                                                                                                        at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                                                                        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
                                                                                                                        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
                                                                                                                        at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
                                                                                                                        at android.view.View.layout(View.java:14008)
                                                                                                                        at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                                                                        at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
                                                                                                                        at android.view.View.layout(View.java:14008)
                                                                                                                        at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                                                                        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892)
                                                                                                                        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711)
                                                                                                                        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
                                                                                                                        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
                                                                                                                        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
                                                                                                                        at android.view.Choreographer.doCallbacks(Choreographer.java:562)
                                                                                                                        at android.view.Choreographer.doFrame(Choreographer.java:532)
                                                                                                                        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
                                                                                                                        at android.os.Handler.handleCallback(Handler.java:725)
                                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:92)
                                                                                                                        at android.os.Looper.loop(Looper.java:137)
                                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:5041)
                                                                                                                        at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                                                        at java.lang.reflect.Method.invoke(Method.java:511)
                                                                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
                                                                                                                        at dalvik.system.NativeStart.main(Native Method)
10-27 21:03:43.956 12462-12462/? I/Process: Sending signal. PID: 12462 SIG: 9

请检查我想要获取的图像但出现错误

【问题讨论】:

  • getDataAdapter1.getImageUrlName() 的示例输出是什么?是text 还是URL。无论是什么,它都会根据您的代码设置为您的ImageUrlNameView
  • 它的 url 从数据库中获取。它显示整个链接,我只想显示一个文本。单击文本将转到 url 页面
  • 你应该像stackoverflow.com/a/14517468/3758972那样做。 HTML
  • 如果您不想显示超链接,最好制作一个带有打开浏览器的 onclick 按钮。只需将 url 传递给它
  • 好的,我会尝试按钮而不是文本视图

标签: android android-studio android-recyclerview


【解决方案1】:

把点击的逻辑改成onBindViewHolder这样,你就有了当前对象的URL:

 @Override
        public void onBindViewHolder(ViewHolder Viewholder, int position) {

            GetDataAdapter getDataAdapter1 =  getDataAdapter.get(position);

            imageLoader1 = ServerImageParseAdapter.getInstance(context).getImageLoader();

            imageLoader1.get(getDataAdapter1.getImageServerUrl(),
                    ImageLoader.getImageListener(
                            Viewholder.networkImageView,//Server Image
                            R.mipmap.ic_launcher,//Before loading server image the default showing image.
                            android.R.drawable.ic_dialog_alert //Error image if requested image dose not found on server.
                    )
            );

            Viewholder.networkImageView.setImageUrl(getDataAdapter1.getImageServerUrl(), imageLoader1);

            Viewholder.ImageTitleNameView.setText(getDataAdapter1.getImageTitleName());

            Viewholder.ImageUrlNameView.setText("Install");



Viewholder.ImageUrlNameView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        String url = getDataAdapter1.getImageUrlName();

                        Intent intent = new Intent(Intent.ACTION_VIEW);
                        intent.setData(Uri.parse(url));
                        context.startActivity(intent);
                    }
                });

        }

        @Override
        public int getItemCount() {

            return getDataAdapter.size();
        }

        class ViewHolder extends RecyclerView.ViewHolder{

            public NetworkImageView networkImageView ;
            public TextView ImageTitleNameView;
            public Button ImageUrlNameView ;

            public ViewHolder(View itemView) {

                super(itemView);

                networkImageView = (NetworkImageView) itemView.findViewById(R.id.VollyNetworkImageView1) ;
                ImageTitleNameView = (TextView) itemView.findViewById(R.id.textView_item);
                ImageUrlNameView = (Button) itemView.findViewById(R.id.bAppUrl) ;
                //ImageUrlNameView.setMovementMethod(LinkMovementMethod.getInstance());
                //Linkify.addLinks(ImageUrlNameView, Linkify.WEB_URLS);




            }


        }

【讨论】:

  • 小修正其context.startActivity(intent);不是我的主意。它的建议。工作炉排。谢谢大家
  • 当我点击返回按钮时,它会从应用程序中退出。如何回到以前的活动。结束();显示错误。
【解决方案2】:

方法一: 试试这个对我有用的 - 1) 字符串 installString = "安装"; String hyperlinkString = "任意字符串" + installString + " text"; SpannableString hyperlinkText = makeHyperlinkText(hyperlinkString, installString); textView.setText(hyperlinkText); textView.setMovementMethod(LinkMovementMethod.getInstance());

2) 功能在这里:

private SpannableString makeHyperlinkText(String hyperlinkString, String textToMakeHyperlink) {
        SpannableString content = new SpannableString(hyperlinkString);
        ClickableSpan clickableSpan = new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                Intent webviewIntent = new Intent(YourCurrentActivity.this, WebviewActivity.class);
                webviewIntent.putExtra("URL", your_url_here); //EDIT
                startActivity(webviewIntent);
                }
            };
            int startIndex = hyperlinkString.indexOf(textToMakeHyperlink);
            int endIndex = startIndex + textToMakeHyperlink.length();
            content.setSpan(clickableSpan, startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            return content;
    }

//编辑:在下面添加了这些文件

3) WebviewActivity 类在这里 -

public class WebviewActivity extends AppCompactActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_webview_layout);

        String url = getIntent().getStringExtra("URL");

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        WebView myWebView = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        myWebView.loadUrl(url);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                onBackPressed();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

4) Webview Layour 类(根据需要自定义):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.massmutual.css.ui.loan.LoanDisclosureWebView">

    <WebView  xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</RelativeLayout>

方法 2: 您可以更改传递 url 字符串的方式。它需要是 HTML 格式。 例如:

<a href="www.google.com">Click here for google.</a>

所以我认为你的文字会是这样的:

    String url = "http://mydomin.com?id=2054656";
    String text = "install";
    String hyperlinkText = "<a href=\"" + url + "\""> + text + "</a>";

如果这些对你有用,请告诉我。

【讨论】:

  • 不工作。请查看我的代码,我已将 textview 更改为按钮。
  • 查看编辑。您可以使其与 TextView 本身一起使用。
  • 好的,我正在从 json 获取 url 并设置为 ImageUrlNameView 字符串。现在当我使用 ImageUrlNameView = (Button) itemView.findViewById(R.id.bAppUrl) ;它用url替换文本。很好,但我不想显示网址。当我单击安装字符串时,它应该转到 url。你做得很好。但我无法更改脚本,我不擅长 android
  • 还有一件事是 RecyclerView。数据在循环中
猜你喜欢
  • 2012-04-08
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 2023-03-28
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
相关资源
最近更新 更多