如何通过单击 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.
}
我不知道如何通过单击 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.
}