У меня есть 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);
}
In 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);
}
Adaper для избранных. Адаптер избранного содержит Новости, и мы вызываем метод add здесь в MainActivity
@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 ( . java: 50) на com.example.newsfragment.HomeFragment $ 2.respond (HomeFragment. java: 51) на com.example.newsfragment.HomeFragment $ 1.likeClick (HomeFragment. java: 43) на ком. example.newsfragment.NewsListAdapter $ 1.onClick (NewsListAdapter. java: 61) в android .view.View.performClick (Просмотреть. java: 7125) в android .view.View.performClickInternal (Просмотреть. java: 7102) в android .view.View.access $ 3500 (просмотр. java: 801) в android .view.View $ PerformClick.run (просмотр. java: 27336) в android .os.Handler.handleCallback (Обработчик. java: 883) в android .os.Handler.dispatchMessage (Обработчик . java: 100) в android .os.Looper.l oop (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)
50 строк в MainActivity
public void respond(News news) {
FavouriteFragment f = (FavouriteFragment)
getSupportFragmentManager().findFragmentById(R.id.fragment_container);
f.addNews(news);
}