如何创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/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()。