У меня есть два фрагмента с навигационной кнопкой. Я хочу нажать кнопку, как на моей домашней странице после того, как в избранном фрагменте появится этот элемент. Я использую два интерфейса, один для соединения фрагментов, а второй для соединения фрагмента и адаптера. Итак, в моем HomeAdapter я сделал:
private List<News> mainList;
private ItemClickListener listener;
public NewsListAdapter(@Nullable List<News> mainList,
ItemClickListener listener) {
this.mainList = mainList;
this.listener = listener;
}
public NewsListAdapter(@Nullable List<News> mainList) {
this.mainList = mainList;
}
@NonNull
@Override
public NewsListAdapter.NewsViewHolder 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 NewsViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final
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);
}
И в своем домашнем фрагменте я пишу метод, подобный Click
public class HomeFragment extends Fragment implements
NewsListAdapter.ItemClickListener {
private NewsListAdapter.ItemClickListener listener = null;
private NewsListAdapter newsListAdapter;
private RecyclerView recyclerView;
private Add add;
public HomeFragment() {
}
@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()));
this.newsListAdapter = new NewsListAdapter(newsGenerator(),
this);
recyclerView.setAdapter(newsListAdapter);
return rootView;
}
@Override
public void likeClick(int position, News item) {
add.respond(item);
newsListAdapter.notifyItemChanged(position);
}
public void onAttach(Activity activity) {
super.onAttach(activity);
add = (Add) activity;
}
А вот мой интерфейс для соединения с избранным фрагментом:
public interface Add {
void respond(News news);
}
В основной деятельности я понял, что метод отвечает:
public void respond(News news) {
FavouriteFragment f = (FavouriteFragment)
getSupportFragmentManager().findFragmentById(R.id.favourite_fragment);
f.addNews(news);
}
И в свой любимый фрагмент я добавляю:
public void addNews(News news) {
newsList.add(news);
recyclerView.getAdapter().notifyItemInserted(newsList.size() -
1);
}
И когда я нажимаю, как мое приложение, происходит сбой в logcat:
2020-03-28 19:17:23.705 23023-23023/com.example.newsfragment E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.newsfragment, PID: 23023
java.lang.NullPointerException: Attempt to invoke virtual method 'void
com.example.newsfragment.FavouriteFragment.addNews(com.example.newsfragment.News)' on a null
object reference
at com.example.newsfragment.MainActivity.respond(MainActivity.java:57)
at com.example.newsfragment.HomeFragment.likeClick(HomeFragment.java:49)
at com.example.newsfragment.NewsListAdapter$1.onClick(NewsListAdapter.java:57)
at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)