如何在回收商的Webview中动态打开URL数据在Android中查看项目单击



在我的应用程序中,我正在使用回收器视图和改造来加载新闻标题,描述和图像。由于我是动态加载的,因此每个回收器视图适配器项都会从不同的URL加载新闻标题,因此我希望我的用户在单击特定的适配器行项时阅读webView上的详细新闻。我不知道如何实现此功能。我想以这样一种方式呈现,考虑回收器视图适配器项目是否包含来自带有该图像的 URL 的"新闻 1",如果用户单击适配器项目,则该特定 URL 以及新闻和图像应该加载到单独的 webView 中。同样,如果用户单击任何适配器项,则与行项对应的 URL 应在 webView 中单独加载

下面是示例响应:

{
    "status": "success",
    "msg": "news_list",
    "news_details": [
        {
            "title": "news title",
            "image": "",
            "description": "<img src='https://images.link.com",
            "link": "https://www.somenewslink.com/news.html",
            "view_link": "https://www.somenewslink.com/news.html",
            "provider": "NewsProvider"
        }

这是我的自定义适配器:

public class FragmentOneAdapter extends RecyclerView.Adapter<FragmentOneAdapter.MyViewHolder>{
    Context context;
    Activity mActivity;
    List<NewsList> newsList = new ArrayList<>();
    public static final String TAG = FragmentOneAdapter.class.getSimpleName();
    public FragmentOneAdapter(Activity activity, List<NewsList> newsList){
        this.mActivity = activity;
        this.newsList = newsList;
    }



    @Override
    public FragmentOneAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_one, parent, false);
        return new MyViewHolder(view);
    }
    @Override
    public void onBindViewHolder(FragmentOneAdapter.MyViewHolder holder, final int position) {
        Log.e(TAG, "size==>"+ newsList.size());

        holder.newsTitle.setText(newsList.get(position).title);
        holder.description_tView.setText(newsList.get(position).description);
        holder.provider_tView.setText(newsList.get(position).provider);
        try {
            if (!newsList.get(position).image.equals("")) {
                if (newsList.get(position).image != null) {

                    Picasso
                            .with(mActivity)
                            .load(newsList.get(position).image)
                            .into(holder.newsImageView);
                    holder.newsImageView.setScaleType(ImageView.ScaleType.FIT_XY);
                } else {
                    Log.e(TAG, "_image_empty==>");
                }

            } else {
                Log.e(TAG, "_image_empty==>");
                //    Toast.makeText(HomeActivity.this, "profile_image is Empty", Toast.LENGTH_SHORT).show();
            }

        }catch (NullPointerException e){
            Toast.makeText(context, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
    @Override
    public int getItemCount(){
        return newsList.size();
    }
    public class MyViewHolder extends RecyclerView.ViewHolder{
        TextView newsTitle;
        TextView description_tView;
        TextView provider_tView;
        ImageView newsImageView;
        LinearLayout click;


        public MyViewHolder(View itemView) {
            super(itemView);

            newsImageView = (ImageView)itemView.findViewById(R.id.newsImageView);
            description_tView = (TextView) itemView.findViewById(R.id.description_tView);
            provider_tView = (TextView)itemView.findViewById(R.id.provider_tView);
            newsTitle = (TextView)itemView.findViewById(R.id.newsTitle);
            click = (LinearLayout)itemView.findViewById(R.id.click);
        }
    }
}

这就是我在主片段类中对它的称呼:

public class OneFragment extends Fragment{
    RecyclerView recyclerView;
    RetrofitInterface apiInterface;
    Activity activity;
    FragmentOneAdapter fragmentOneAdapter;
    public List<NewsList> newsLists;
    public static final String TAG = OneFragment.class.getSimpleName();
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_one, container, false);
        activity = getActivity();
        Initialization(view);

        return view;
    }
    public void Initialization(View view){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(RetrofitInterface.serverUrl)
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        apiInterface = retrofit.create(RetrofitInterface.class);
        GetNews();
        recyclerView = (RecyclerView)view.findViewById(R.id.recyclerView);
        recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new RecyclerTouchListener.ClickListener() {
            @Override
            public void onClick(View view, int position) {
                Toast.makeText(getActivity(),"This recyclerview has been clicked",Toast.LENGTH_SHORT).show();

            }
            @Override
            public void onLongClick(View view, int position) {
            }
        }));
        }
        public void GetNews(){
            Log.e(TAG, "GetNews==>");
            CommonRequest commonRequest = new CommonRequest();
            commonRequest.user_id = "1";
            commonRequest.language_id = "1";
            commonRequest.type_id = "10";
            final Call<ListDetails>newslist = apiInterface.news(commonRequest);
            newslist.enqueue(new Callback<ListDetails>() {
                @Override
                public void onResponse(Call<ListDetails> call, Response<ListDetails> response) {
                    if (response.body() != null) {
                        if (response.body().status.equalsIgnoreCase("success")) {
                            if (!response.body().news_details.isEmpty()) {
                                if (response.body().news_details != null) {
                                    newsLists = response.body().news_details;
                                    Log.e(TAG, "list_size ==>" + newsLists);
                                    LinearLayoutManager layoutManager = new LinearLayoutManager(activity);
                                    fragmentOneAdapter = new FragmentOneAdapter(activity, newsLists);
                                    recyclerView.setAdapter(fragmentOneAdapter);
                                    recyclerView.setLayoutManager(layoutManager);
                                    fragmentOneAdapter.notifyDataSetChanged();


                                }else {
                                    Log.e(TAG, "list_empty==>");
                                }
                            }else {
                                Log.e(TAG, "list_empty==>");
                            }
                        }else {
                            Toast.makeText(activity, response.body().msg, Toast.LENGTH_LONG).show();
                        }
                    }
                }
                @Override
                public void onFailure(Call<ListDetails> call, Throwable t) {
                    Toast.makeText(getActivity(),"Server Busy",Toast.LENGTH_LONG).show();

                }
            });



        }



}

如果我没有误解,你有新闻标题的Recycler view和新闻细节的webview

在这种情况下,可以告诉webview在触发项的onClick方法时加载News URL

recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new RecyclerTouchListener.ClickListener() {
    @Override
    public void onClick(View view, int position) {
       // Load your URL here
       // WebView.loadURL(newsList[position].view_link) or etc

    }
    @Override
    public void onLongClick(View view, int position) {
    }
));
如果您想

加载新页面,只需使用 WebView 将 url 推送到Bundle的新Activity/Fragment并显示它。

最新更新