我如何连接两个片段并在适配器中编写监听器
How I can connect two fragments and write listeners in adapter
我有2个片段。当我在一个片段中点赞时,在第二个片段中必须出现我喜欢的新闻。
这是我最喜欢的片段我有一个方法 Add()
RecyclerView recyclerView;
private FavouriteListAdapter adapter;
private List<News> newsList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup)inflater.inflate(R.layout.fragment_favourite, container,
false);
recyclerView = rootView.findViewById(R.id.recycler_favourite);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
newsList= new ArrayList<>();
adapter = new FavouriteListAdapter(newsList);
recyclerView.setAdapter(adapter);
return rootView;
}
public void addNews(News news) {
newsList.add(news);
recyclerView.getAdapter().notifyItemInserted(newsList.size() - 1);
}
在 Home Fragment 中,我使用接口侦听器并添加
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_home, container, false);
recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_home);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
listener = new NewsListAdapter.ItemClickListener() {
@Override
public void likeClick(int position, News item) {
add.respond(item);
newsListAdapter.notifyItemChanged(position);
}
};
add = new NewsListAdapter.Add() {
@Override
public void respond(News news) {
((MainActivity) getActivity()).respond(news);
}
};
newsListAdapter = new NewsListAdapter(newsGenerator(), listener, add);
recyclerView.setAdapter(newsListAdapter);
return rootView;
}
家用适配器
@Override
public void onBindViewHolder(@NonNull NewsListAdapter.NewsViewHolder holder, final int position)
{
final News news = mainList.get(position);
holder.theme.setText(news.getTheme());
holder.like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener!=null){
listener.likeClick(position,news);
}
}
});
@Override
public int getItemCount() {
return mainList.size();
}
public class NewsViewHolder extends RecyclerView.ViewHolder {
private TextView theme;
private ImageButton like;
public NewsViewHolder(@NonNull View itemView) {
super(itemView);
theme = itemView.findViewById(R.id.theme);
like = itemView.findViewById(R.id.like);
}
}
interface ItemClickListener {
void likeClick(int position, News item);
}
public interface Add{
void respond(News news);
}
收藏夹的适配器。适配器收藏夹包含新闻,我们在 MainActivity
中调用方法 add
@NonNull
@Override
public FavouriteListAdapter.FavouriteNewsHolder onCreateViewHolder(@NonNull ViewGroup parent,
int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news, null,false);
RecyclerView.LayoutParams params = new RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
view.setLayoutParams(params);
return new FavouriteNewsHolder(view);
}
@Override
public void onBindViewHolder(@NonNull FavouriteListAdapter.FavouriteNewsHolder holder, int
position) {
final News news = newsList.get(position);
holder.theme.setText(news.getTheme());
}
@Override
public int getItemCount() {
return newsList.size();
}
public class FavouriteNewsHolder extends RecyclerView.ViewHolder {
TextView theme;
ImageButton like;
public FavouriteNewsHolder(@NonNull View itemView) {
super(itemView);
theme = itemView.findViewById(R.id.theme);
like = itemView.findViewById(R.id.like);
}
}
在 Activity 我覆盖了我的方法。当我执行我的程序并单击按钮时,单击程序停止
@Override
public void respond(News news) {
FavouriteFragment f = (FavouriteFragment)
getSupportFragmentManager().findFragmentById(R.id.fragment_container);
f.addNews(news);
}
在logcat中:
2020-03-24 21:55:12.367 13933-13933/com.example.newsfragment E/AndroidRuntime:致命异常:主要
进程:com.example.newsfragment,PID:13933
java.lang.ClassCastException: com.example.newsfragment.HomeFragment 无法转换为 com.example.newsfragment.FavouriteFragment
在 com.example.newsfragment.MainActivity.respond(MainActivity.java:50)
在 com.example.newsfragment.HomeFragment$2.respond(HomeFragment.java:51)
在 com.example.newsfragment.HomeFragment$1.likeClick(HomeFragment.java:43)
在 com.example.newsfragment.NewsListAdapter$1.onClick(NewsListAdapter.java:61)
在 android.view.View.performClick(View.java:7125)
在 android.view.View.performClick 内部(View.java:7102)
在 android.view.View.access3500 美元(View.java:801)
在 android.view.View$PerformClick.run(View.java:27336)
在 android.os.Handler.handleCallback(Handler.java:883)
在 android.os.Handler.dispatchMessage(Handler.java:100)
在 android.os.Looper.loop(Looper.java:214)
在 android.app.ActivityThread.main(ActivityThread.java:7356)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Main 中的第 50 行Activity
public void respond(News news) {
FavouriteFragment f = (FavouriteFragment)
getSupportFragmentManager().findFragmentById(R.id.fragment_container);
f.addNews(news);
}
使用事件总线与片段进行此类通信。使用 https://github.com/greenrobot/EventBus 这个库我已经实现了同样的事情(当时像 homeFragment 中的 post 我想在多个片段中喜欢 post)
注册和注销 EventBus
@Override public void onStart() {
super.onStart();
EventBus.getDefault().register(this); }
@Override public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this); }
Post 事件:
EventBus.getDefault().post(new MessageEvent());
我有2个片段。当我在一个片段中点赞时,在第二个片段中必须出现我喜欢的新闻。
这是我最喜欢的片段我有一个方法 Add()
RecyclerView recyclerView;
private FavouriteListAdapter adapter;
private List<News> newsList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup)inflater.inflate(R.layout.fragment_favourite, container,
false);
recyclerView = rootView.findViewById(R.id.recycler_favourite);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
newsList= new ArrayList<>();
adapter = new FavouriteListAdapter(newsList);
recyclerView.setAdapter(adapter);
return rootView;
}
public void addNews(News news) {
newsList.add(news);
recyclerView.getAdapter().notifyItemInserted(newsList.size() - 1);
}
在 Home Fragment 中,我使用接口侦听器并添加
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_home, container, false);
recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_home);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
listener = new NewsListAdapter.ItemClickListener() {
@Override
public void likeClick(int position, News item) {
add.respond(item);
newsListAdapter.notifyItemChanged(position);
}
};
add = new NewsListAdapter.Add() {
@Override
public void respond(News news) {
((MainActivity) getActivity()).respond(news);
}
};
newsListAdapter = new NewsListAdapter(newsGenerator(), listener, add);
recyclerView.setAdapter(newsListAdapter);
return rootView;
}
家用适配器
@Override
public void onBindViewHolder(@NonNull NewsListAdapter.NewsViewHolder holder, final int position)
{
final News news = mainList.get(position);
holder.theme.setText(news.getTheme());
holder.like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener!=null){
listener.likeClick(position,news);
}
}
});
@Override
public int getItemCount() {
return mainList.size();
}
public class NewsViewHolder extends RecyclerView.ViewHolder {
private TextView theme;
private ImageButton like;
public NewsViewHolder(@NonNull View itemView) {
super(itemView);
theme = itemView.findViewById(R.id.theme);
like = itemView.findViewById(R.id.like);
}
}
interface ItemClickListener {
void likeClick(int position, News item);
}
public interface Add{
void respond(News news);
}
收藏夹的适配器。适配器收藏夹包含新闻,我们在 MainActivity
中调用方法 add@NonNull
@Override
public FavouriteListAdapter.FavouriteNewsHolder onCreateViewHolder(@NonNull ViewGroup parent,
int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news, null,false);
RecyclerView.LayoutParams params = new RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
view.setLayoutParams(params);
return new FavouriteNewsHolder(view);
}
@Override
public void onBindViewHolder(@NonNull FavouriteListAdapter.FavouriteNewsHolder holder, int
position) {
final News news = newsList.get(position);
holder.theme.setText(news.getTheme());
}
@Override
public int getItemCount() {
return newsList.size();
}
public class FavouriteNewsHolder extends RecyclerView.ViewHolder {
TextView theme;
ImageButton like;
public FavouriteNewsHolder(@NonNull View itemView) {
super(itemView);
theme = itemView.findViewById(R.id.theme);
like = itemView.findViewById(R.id.like);
}
}
在 Activity 我覆盖了我的方法。当我执行我的程序并单击按钮时,单击程序停止
@Override
public void respond(News news) {
FavouriteFragment f = (FavouriteFragment)
getSupportFragmentManager().findFragmentById(R.id.fragment_container);
f.addNews(news);
}
在logcat中: 2020-03-24 21:55:12.367 13933-13933/com.example.newsfragment E/AndroidRuntime:致命异常:主要 进程:com.example.newsfragment,PID:13933 java.lang.ClassCastException: com.example.newsfragment.HomeFragment 无法转换为 com.example.newsfragment.FavouriteFragment 在 com.example.newsfragment.MainActivity.respond(MainActivity.java:50) 在 com.example.newsfragment.HomeFragment$2.respond(HomeFragment.java:51) 在 com.example.newsfragment.HomeFragment$1.likeClick(HomeFragment.java:43) 在 com.example.newsfragment.NewsListAdapter$1.onClick(NewsListAdapter.java:61) 在 android.view.View.performClick(View.java:7125) 在 android.view.View.performClick 内部(View.java:7102) 在 android.view.View.access3500 美元(View.java:801) 在 android.view.View$PerformClick.run(View.java:27336) 在 android.os.Handler.handleCallback(Handler.java:883) 在 android.os.Handler.dispatchMessage(Handler.java:100) 在 android.os.Looper.loop(Looper.java:214) 在 android.app.ActivityThread.main(ActivityThread.java:7356) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Main 中的第 50 行Activity
public void respond(News news) {
FavouriteFragment f = (FavouriteFragment)
getSupportFragmentManager().findFragmentById(R.id.fragment_container);
f.addNews(news);
}
使用事件总线与片段进行此类通信。使用 https://github.com/greenrobot/EventBus 这个库我已经实现了同样的事情(当时像 homeFragment 中的 post 我想在多个片段中喜欢 post)
注册和注销 EventBus
@Override public void onStart() {
super.onStart();
EventBus.getDefault().register(this); }
@Override public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this); }
Post 事件:
EventBus.getDefault().post(new MessageEvent());