如何在片段和适配器之间创建接口?使用事件总线:使用接口:

2022-08-31 15:29:37

我有片段与,说,和习惯。我正在此适配器中为列表行中的按钮进行设置。ListViewMyListFragmentCursorAdapteronClickListener

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
    }
}

我需要在按下按钮时通知片段。如何调用此接口?

请帮忙。


答案 1

创建一个新的构造函数和一个实例变量:

AdapterInterface buttonListener;

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

创建适配器时,将为实例变量提供正确的引用以保持。

要从单击中调用片段:

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

在创建 时,您还必须将片段传递到适配器。例如Adapter

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

因为将引用您的片段,现在是.thisAdapterInterface

请记住,在片段的方向发生变化时,它很可能会被重新创建。如果未重新创建 Adapter,它可能会保留对不存在的对象的引用,从而导致错误。


答案 2

使用事件总线:

例子:

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

https://github.com/greenrobot/EventBus

使用接口:

我理解目前的答案,但需要一个更清晰的例子。以下是我与 (RecyclerView.Adapter) 和 .AdapterFragment

创建回调接口:

public interface AdapterCallback {
    void onMethodCallback();
}

传入回调/片段

这将实现我们在.在此示例中,当用户单击 中的项目时,将调用它。interfaceAdapterRecyclerView

在您的片段中

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
    }
}

在适配器中使用回调

在 中,我们启动了 our 并将其作为参数传递给构造函数。这将启动我们的 for 回调方法。您可以看到,我们对用户点击使用回调方法。FragmentAdapterinterface

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();
            }
        });
    }
}

或使用适配器中的片段

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