Sab*_*bre 53 java android interface
我有片段ListView,比方说MyListFragment和自定义CursorAdapter.我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
}
}
Run Code Online (Sandbox Code Playgroud)
我需要在按下按钮时通知片段.如何调用此界面?
请帮忙.
A--*_*--C 77
创建一个新的构造函数和一个实例变量:
AdapterInterface buttonListener;
public MyListAdapter (Context context, Cursor c, int flags, AdapterInterface buttonListener)
{
super(context,c,flags);
this.buttonListener = buttonListener;
}
Run Code Online (Sandbox Code Playgroud)
制作适配器后,实例变量将被赋予适当的保持参考.
要从点击中调用片段:
public void onClick(View v) {
buttonListener.buttonPressed();
}
Run Code Online (Sandbox Code Playgroud)
制作时Adapter,您还必须将片段传递给适配器.例如
MyListAdapter adapter = new MyListAdapter (getActivity(), myCursor, myFlags, this);
Run Code Online (Sandbox Code Playgroud)
因为this将引用你的碎片,现在是一个AdapterInterface.
请记住,在片段方向更改时,很可能会重新创建.如果未重新创建适配器,则可能会保留对不存在的对象的引用,从而导致错误.
Jar*_*ows 66
例子:
要么
https://github.com/greenrobot/EventBus
我理解当前的答案,但需要一个更清晰的例子.这是我与Adapter(RecyclerView.Adapter)和a 一起使用的示例Fragment.
创建Callback界面:
public interface AdapterCallback {
void onMethodCallback();
}
Run Code Online (Sandbox Code Playgroud)
传入Callback/ Fragment:
这将实现interface我们所拥有的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
}
}
Run Code Online (Sandbox Code Playgroud)
使用Callback你的适配器:
在Fragment,我们启动了我们Adapter并将其作为构造函数的参数传递.这将启动我们interface的回调方法.您可以看到我们使用回调方法进行用户点击.
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();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
或使用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
}
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
Pha*_*inh 30
按照以下两个步骤接收来自Adapter的回调Fragment (or Activity)
第一:在你的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);
}
});
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
第二:在你Fragment (or Activity)的实现回调方法中有2种方法
方式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();
}
});
...
}
}
Run Code Online (Sandbox Code Playgroud)
方式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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
65149 次 |
| 最近记录: |