?前言
在学习《第一行代码》,4.5 小节——一个简易版的新闻应用的时候??;
在为 RecyclerView 创建适配器的时候;
作者直接在 NewsTitleFragment.java 中新建了一个内部类 NewsAdapter 来作为 RecyclerView 的适配器;
我就在想,是不是可以将 NewsAdapter 摘出来,作为一个独立的类来使用;
本着求知若渴的态度,便产生了这篇博客;
?前行必备
在简易版的新闻应用中,为了区分平板和手机,新建了一个 layout-sw600dp 文件夹;
而本节的重点是如何在 Adapter 中调用 Fragment,所以一切从简;
新建一个项目,我命名为 TestFragment,并选择 Empty Activity;
这样 Android Studio 自动生成了 MainActivity.java 和 activity_main.xml 文件;
?渐入佳境
首先,准备好一个新闻实体类,新建类 News;
News.java
public class News { String title; String content; News(String title,String content){ this.title = title; this.content = content; } public String getTitle() { return title; } public String getContent() { return content; } }title 表示新闻标题,content 表示新闻内容;
接着新建布局文件 right_fragment.xml,用于作为新闻内容的布局;
right_fragment.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp" android:background="@color/yello"> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textSize="30sp" android:textColor="@color/black" /> <View android:layout_width="match_parent" android:layout_height="2dp" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:background="@color/black"/> <TextView android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:textSize="20sp" android:textColor="@color/gray" /> </LinearLayout>该代码的布局和新闻应用中的 news_content_frag.xml 布局大同小异,这里不再赘述;
在新建一个 RightFragment 类,继承自 Fragmet;
RightFragment.java
public class RightFragment extends Fragment { View view; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(R.layout.right_fragment,container,false); return view; } public void refresh(String title,String content){ TextView mTitle = view.findViewById(R.id.title); TextView mContent = view.findViewById(R.id.content); mTitle.setText(title); mContent.setText(content); } }该代码的功能同新闻应用中的 NewsContentFragment 相同;
接下来创建一个用于显示新闻列表的布局,新建 left_fragment.xml;
left_fragment.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@color/green" android:padding="10dp"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/left_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>功能同新闻应用中的 news_title_frag;
新建 item.xml 作为 RecyclerView 子项的布局;
item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/item_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" android:textStyle="bold" /> </LinearLayout>该代码中仅放置了一个 TextView 用于展示标题;
接下来我们就需要一个用于展示新闻列表的地方;
新建一个 LeftFragment 类作为展示新闻列表的碎片;
LeftFragment.java
public class LeftFragment extends Fragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.left_fragment, container, false); return view; } }在 onCreateView() 方法中加载了 left_fragment 布局;
接下来就是为 RecyclerView 添加适配器,有两种方式:
- 在 LeftFragment.java 中新建一个内部类 NewsAdapter 来作为 RecyclerView 的适配器
- 将 NewsAdapter 作为一个独立的类作为 RecyclerView 的适配器
?内部类方式
修改 LeftFragment.java 中的代码;
LeftFragment.java
public class LeftFragment extends Fragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.left_fragment, container, false); RecyclerView rv = view.findViewById(R.id.left_recycler_view); LinearLayoutManager manager = new LinearLayoutManager(null); rv.setLayoutManager(manager); NewsAdapter adapter = new NewsAdapter(getData()); rv.setAdapter(adapter); return view; } class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder>{ private List<News> mList; class ViewHolder extends RecyclerView.ViewHolder{ TextView title; public ViewHolder(@NonNull View view) { super(view); title = view.findViewById(R.id.item_text_view); } } public NewsAdapter(List<News> list){ mList = list; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false); ViewHolder holder = new ViewHolder(view); view.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { News news = mList.get(holder.getAdapterPosition()); FragmentManager manager = getFragmentManager(); RightFragment fragment = (RightFragment) manager.findFragmentById(R.id.right_fragment); fragment.refresh(news.getTitle(),news.getContent()); } }); return holder; } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { News news = mList.get(position); holder.title.setText(news.getTitle()); } @Override public int getItemCount() { return mList.size(); } } private List<News> getData() { List<News> list = new ArrayList<>(); for (int i = 1; i <= 5; i++) { list.add(new News("Title" + i, "Content" + i)); } return list; } }该方法同新闻应用中的添加适配器的方式相同,在此不再赘述;
运行效果
?独立类方式
?声明
参考资料: