如何创buildFragment和适配器之间的接口?

我有片段与ListView ,说MyListFragment和自定义CursorAdapter 。 我在这个适配器中为列表行中的button设置onClickListener

 public class MyListAdapter extends CursorAdapter { public interface AdapterInterface { public void buttonPressed(); } ... @Override public void bindView(final View view, final Context context, final Cursor cursor) { ViewHolder holder = (ViewHolder) view.getTag(); ... holder.button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // some action // need to notify MyListFragment } }); } } public MyListFragment extends Fragment implements AdapterInterface { @Override public void buttonPressed() { // some action } } 

当按下button时,我需要通知片段。 如何调用这个接口?

请帮助。

创build一个新的构造函数和一个实例variables:

 AdapterInterface buttonListener; public MyListAdapter (Context context, Cursor c, int flags, AdapterInterface buttonListener) { super(context,c,flags); this.buttonListener = buttonListener; } 

当适配器生成时,实例variables将被赋予适当的引用来保存。

从点击调用片段:

 public void onClick(View v) { buttonListener.buttonPressed(); } 

制作Adapter ,您还必须将您的Fragment传递给适配器。 例如

 MyListAdapter adapter = new MyListAdapter (getActivity(), myCursor, myFlags, this); 

因为this将引用您的Fragment,它现在是AdapterInterface

请记住,在片段变化的方向上,它很可能会被重新创build。 如果您的适配器没有重新创build,它可能会保留一个不存在的对象的引用,导致错误。

使用Eventbus:

例子:

https://github.com/kaushikgopal/RxJava-Android-Samples/tree/master/app/src/main/java/com/morihacky/android/rxjava/rxbus

要么

https://github.com/greenrobot/EventBus

使用接口:

我明白目前的答案,但需要一个更清晰的例子。 这里是我用一个Adapter (RecyclerView.Adapter)和一个Fragment的例子。

创buildCallback接口:

 public interface AdapterCallback { void onMethodCallback(); } 

传递Callback / Fragment

这将实现我们在Adapter中的Adapter 。 在这个例子中,当用户点击RecyclerView一个项目时,它会被调用。

在你的Fragment

 public class MyFragment extends Fragment implements AdapterCallback { private MyAdapter mMyAdapter; @Override public void onMethodCallback() { // do something } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.mMyAdapter = new MyAdapter(this); // this class implements callback } } 

在您的适配器中使用Callback

Fragment ,我们启动了Adapter并将其作为parameter passing给构造者。 这将启动我们的callback方法的interface 。 你可以看到我们使用我们的callback方法用户点击。

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private AdapterCallback mAdapterCallback; public MyAdapter(AdapterCallback callback) { this.mAdapterCallback = callback; } @Override public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, final int i) { // simple example, call interface here // not complete viewHolder.itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mAdapterCallback.onMethodCallback(); } }); } } 

或者在适配器中使用Fragment

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private AdapterCallback mAdapterCallback; public MyAdapter(Fragment fragment) { try { this.mAdapterCallback = ((AdapterCallback) fragment); } catch (ClassCastException e) { throw new ClassCastException("Fragment must implement AdapterCallback."); } } @Override public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, final int i) { // simple example, call interface here // not complete viewHolder.itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { mAdapterCallback.onMethodCallback(); } catch (ClassCastException exception) { // do something } } }); } } 

按照以下两个步骤从Fragment (or Activity) Adapter接收callback

首先:在你的Adapter

 public class ListAdapter extends RecyclerView.Adapter < RecyclerListAdapter.ItemViewHolder > { ... private ListAdapterListener mListener; public interface ListAdapterListener { // create an interface void onClickAtOKButton(int position); // create callback function } public RecyclerListAdapter(Context mContext, ArrayList < Items > listItems, ListAdapterListener mListener) { // add the interface to your adapter constructor ... this.mListener = mListener; // receive mListener from Fragment (or Activity) } ... public void onBindViewHolder(final ItemViewHolder holder, final int position) { holder.btnOK.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // use callback function in the place you want mListener.onClickAtOKButton(position); } }); ... } ... } 

第二:在你的Fragment (or Activity) ,实现callback方法有两种方法

方法1

  public MyListFragment extends Fragment { ... public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { ... ListAdapter adapter = new ListAdapter(getActivity(), listItems, new ListAdapter.ListAdapterListener() { @Override public void onClickAtOKButton(int position) { Toast.makeText(getActivity(), "click ok button at" + position, Toast.LENGTH_SHORT).show(); } }); ... } } 

方式2

 public MyListFragment extends Fragment implements ListAdapter.ListAdapterListener { ... public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { ListAdapter adapter = new ListAdapter (getActivity(), listItems, this); ... } @Override public void onClickAtOKButton(int position) { Toast.makeText(getActivity(), "click ok button at" + position, Toast.LENGTH_SHORT).show(); } } 

这与活动和片段应该交stream的方式非常相似。 在适配器的构造函数中,传递片段的引用,将其转换为接口,然后在onClick方法上调用yourReference.buttonPressed()。