Как мне соединить два фрагмента и их адаптеры - PullRequest
0 голосов
/ 28 марта 2020

У меня есть два фрагмента с навигационной кнопкой. Я хочу нажать кнопку, как на моей домашней странице после того, как в избранном фрагменте появится этот элемент. Я использую два интерфейса, один для соединения фрагментов, а второй для соединения фрагмента и адаптера. Итак, в моем 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...