Как динамически открывать данные URL в Webview на элементе recyclerView? Нажмите на Android? - PullRequest
0 голосов
/ 03 января 2019

В моем приложении я использую recyclerView и модернизацию для загрузки заголовков новостей, описания и изображения. Поскольку я загружаю его динамически, каждый элемент адаптера recyclerView загружает заголовки новостей с разных URL-адресов. Я хотел бы, чтобы мой пользователь читал подробные новости в webView, когда щелкает конкретный элемент строки адаптера. Я не знаю, как реализовать эту функцию. Я хотел бы представить таким образом, чтобы рассмотреть, если элемент адаптера recyclerView содержит «Новости 1» из URL-адреса с этим изображением, и если пользователь нажимает на элемент адаптера, то этот конкретный URL-адрес, а также новости и изображения должны загружаться в индивидуальный веб-просмотр. Аналогичным образом, если пользователь щелкает любой элемент адаптера, 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);

        }
    }
}

И вот как я это называю в классе Main Fragment:

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();


                }
            });






        }






}

1 Ответ

0 голосов
/ 03 января 2019

Если я не ошибаюсь, у вас есть Recycler view для заголовка новостей и webview для подробностей новостей?

В этом случае вы можете указать webview, чтобы загрузить News URLкогда запускается метод элемента onClick.

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) {

    }
));

Если вы хотите загрузить новую страницу, просто нажмите URL через Bundle на новый Activity / Fragment с помощью WebView ипоказать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...