如何通过单击 recyclerview 中的项目在具有 web 视图的新片段上加载网站?

How to load a website on a new fragment with a web view by clicking on items in the recyclerview?

我不知道如何通过单击 Recyclerview 中定义的项目之一在具有 Web 视图的新 fragment 上加载网站。这是我的代码:

NewsItems.java

package com.example.assignment_4_task_1;

import android.view.View;

public class NewsItems {
    private int image;
    private String text;

    public NewsItems(){
    }

    public NewsItems(int image, String text) {
        this.image = image;
        this.text = text;
    }

    //Getter
    public int getImage() {
        return image;
    }

    public String getText() {
        return text;
    }

}

```

Recyclerview Adapter.java

package com.example.assignment_4_task_1;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    Context mContext;
    List<NewsItems> mData;

    public RecyclerViewAdapter(Context mContext, List<NewsItems> mData) {
        this.mContext = mContext;
        this.mData = mData;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        view = LayoutInflater.from(mContext).inflate(R.layout.layout_grid_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.image.setImageResource(mData.get(position).getImage());
        holder.text.setText(mData.get(position).getText());
    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder {
        private ImageView image;
        private TextView text;
        FragmentNewsItems fragmentNewsItems = new FragmentNewsItems();


        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            image = itemView.findViewById(R.id.image);
            text = itemView.findViewById(R.id.text);
        }

    }


}

片段NewsItems.java

package com.example.assignment_4_task_1;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class FragmentNewsItems extends Fragment {

    View view;
    private RecyclerView recyclerView;
    private List<NewsItems> cyberNews;
    private FragmentNewsItems fragmentNewsItems;

    public FragmentNewsItems(){
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.f_news_items_layout, container, false);
        recyclerView = (RecyclerView) view.findViewById(R.id.news_items_recycler_view);

        RecyclerViewAdapter recyclerAdapter = new RecyclerViewAdapter(getContext(), cyberNews);

        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
        recyclerView.setAdapter(recyclerAdapter);
        return view;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        cyberNews = new ArrayList<>();
        cyberNews.add(new NewsItems(R.drawable.cyber1, "The  of cybersecurity in 5G-connected world"));
        cyberNews.add(new NewsItems(R.drawable.cyber2, "Google discovered several iPhone security flaws, and Apple still hasn't patched one"));
        cyberNews.add(new NewsItems(R.drawable.cyber3, "WhatsApp and Telegram media files aren't so secure"));
        cyberNews.add(new NewsItems(R.drawable.cyber4, "Microsoft Exposes Russian Cyberattacks on Phones, Printers, Video Decoders"));
        cyberNews.add(new NewsItems(R.drawable.cyber5, "Tesla demonstrated the power of The Internet of Things"));

    }
}

MainActivity.java

package com.example.assignment_4_task_1;

import android.os.Bundle;

import com.google.android.material.tabs.TabLayout;

import androidx.viewpager.widget.ViewPager;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private TabLayout tabs;
    private ViewPager viewPager;
    private SectionsPagerAdapter adapter;
    private FragmentNewsItems fragmentNewsItems;

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

        tabs = findViewById(R.id.tabs);
        viewPager = findViewById(R.id.view_pager);
        adapter = new SectionsPagerAdapter(getSupportFragmentManager());

        //Add Fragment to the Layout
        adapter.addFragment(new FragmentNewsItems(), "CYBERSECURITY");
        adapter.addFragment(new FragmentWebPage(), "AI");

        viewPager.setAdapter(adapter);
        tabs.setupWithViewPager(viewPager);

    }
}

输出是它在 viewpager 中显示一个两个片段(分别有两个选项卡),在第一个片段上它以交错网格布局显示新闻列表。我的任务是 "functionalize" 应用程序,以便它通过单击此处列出的其中一项来加载网站:

(片段NewsItems.java你可以在上面看到)

        cyberNews = new ArrayList<>();
        cyberNews.add(new NewsItems(R.drawable.cyber1, "The  of cybersecurity in 5G-connected world"));
        cyberNews.add(new NewsItems(R.drawable.cyber2, "Google discovered several iPhone security flaws, and Apple still hasn't patched one"));
        cyberNews.add(new NewsItems(R.drawable.cyber3, "WhatsApp and Telegram media files aren't so secure"));
        cyberNews.add(new NewsItems(R.drawable.cyber4, "Microsoft Exposes Russian Cyberattacks on Phones, Printers, Video Decoders"));
        cyberNews.add(new NewsItems(R.drawable.cyber5, "Tesla demonstrated the power of The Internet of Things"));

但我不知道如何让它工作。

我尝试了不同的方法,但似乎我根本不明白那个应用程序的逻辑。我是 Android 的新手,现在,我真的很难在不同的片段、活动、它们的初始化等之间定位。

应用程序运行,它显示了我创建的所有布局,但没有打开 webview

首先,您需要为 recycler view holder 创建点击事件

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

// add this line
private AdapterView.OnItemClickListener onItemClickListener;

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            private ImageView image;
            private TextView text;
            FragmentNewsItems fragmentNewsItems = new FragmentNewsItems();


            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                image = itemView.findViewById(R.id.image);
                text = itemView.findViewById(R.id.text);

                itemView.setOnClickListener(this);
            }

      @Override
            public void onClick(View view) {
                mAdapter.onItemHolderClick(ViewHolder.this);
            }

        }

        public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
            this.onItemClickListener = onItemClickListener;
        }

        private void onItemHolderClick(ViewHolder holder) {
            if (onItemClickListener != null)
                onItemClickListener.onItemClick(null, holder.itemView, holder.getAdapterPosition(), holder.getItemId());
        }
}

现在在您的片段中添加点击事件

public class FragmentNewsItems extends Fragment implements AdapterView.OnItemClickListener{


View view;
    private RecyclerView recyclerView;
    private List<NewsItems> cyberNews;
    private FragmentNewsItems fragmentNewsItems;

    public FragmentNewsItems(){
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.f_news_items_layout, container, false);
        recyclerView = (RecyclerView) view.findViewById(R.id.news_items_recycler_view);

        RecyclerViewAdapter recyclerAdapter = new RecyclerViewAdapter(getContext(), cyberNews);
// add this line
recyclerAdapter .setOnItemClickListener(this);

        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
        recyclerView.setAdapter(recyclerAdapter);
        return view;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        cyberNews = new ArrayList<>();
        cyberNews.add(new NewsItems(R.drawable.cyber1, "The  of cybersecurity in 5G-connected world"));
        cyberNews.add(new NewsItems(R.drawable.cyber2, "Google discovered several iPhone security flaws, and Apple still hasn't patched one"));
        cyberNews.add(new NewsItems(R.drawable.cyber3, "WhatsApp and Telegram media files aren't so secure"));
        cyberNews.add(new NewsItems(R.drawable.cyber4, "Microsoft Exposes Russian Cyberattacks on Phones, Printers, Video Decoders"));
        cyberNews.add(new NewsItems(R.drawable.cyber5, "Tesla demonstrated the power of The Internet of Things"));

    }


@Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// here open new activity or replace fragment which have webview.
}