我如何连接两个片段并在适配器中编写侦听器

问题描述 投票:0回答:1

我有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);
}

在家庭片段中,我使用接口侦听器并添加

@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。适配器收藏夹包含新闻,我们在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);
    }
}

在活动中,我覆盖了我的方法。当我执行程序并单击按钮时,程序将停止

@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:FATAL EXCEPTION:main流程:com.example.newsfragment,PID:13933java.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.performClickInternal(View.java:7102)在android.view.View.access $ 3500(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)

MainActivity中的第50行

   public void respond(News news) {
   FavouriteFragment f = (FavouriteFragment) 
   getSupportFragmentManager().findFragmentById(R.id.fragment_container);
   f.addNews(news);
   }
java android fragment listener adapter
1个回答
0
投票

将eventBus与此类片段一起使用。使用https://github.com/greenrobot/EventBus这个库,我实现了相同的操作(当我当时喜欢homeFragment中的帖子时,我想在多个片段中喜欢该帖子)

注册和注销EventBus

 @Override public void onStart() {
 super.onStart();
 EventBus.getDefault().register(this);  }

 @Override public void onStop() {
 super.onStop();
 EventBus.getDefault().unregister(this);  }

发布事件:

EventBus.getDefault().post(new MessageEvent());
© www.soinside.com 2019 - 2024. All rights reserved.