在适配器中分配接口侦听器的正确位置在哪里?

Where is the correct place to assign an interface listener in adapters?

有时在 RecyclerView 适配器中,当您单击每行中的项目时调用函数会很有帮助,因此我定义了一个接口并像这样分配了侦听器:

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.RecyclerViewHolder> {
    private List<SomeObject> mSomeObjectList;
    private Context mContext;
    private RowClickListener mListener;

    public interface RowClickListener {
        void someFunction(SomeObject someObject);
    }

    public MyRecyclerViewAdapter(Context context, List<SomeObject> objects) {
        mContext = context;
        mSomeObjectList = objects;
        mListener = (RowClickListener) context;
    }
    //...

这是正确的做法吗?我注意到,当人们在 Fragment 类 中分配侦听器时,他们通常在 OnAttach 方法中执行此操作,而在 Adapter 的情况下,这似乎并不存在。这里什么地方被认为是合适的?

宁愿在 Adapter 中定义它,我建议在 FragmentActivity 中使用它。

Interface 单独定义 class 或在 Fragment/Activity 中定义。

public class SomeActivity extends Activity implements RowClickListener
{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        .
        .
        .
        MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(context,list,this);
    }

    @Override
    public void someFunction(SomeObject someObject){

    }
}

public interface RowClickListener {
    void someFunction(SomeObject someObject);
}

并在您的适配器中 class

private RowClickListener mListener;

public MyRecyclerViewAdapter(Context context, List<SomeObject> objects, RowClickListener listener) {
    mContext = context;
    mSomeObjectList = objects;
    mListener = listener;
}

是的,通过 Adapter 构造函数传递侦听器没问题。但是,在铸造之前检查类型。

public MyRecyclerViewAdapter(Context context, List<SomeObject> objects) 
{
        mContext = context;
        mSomeObjectList = objects;

        if(context instanceOf RowClickListener)
        {
            mListener = (RowClickListener) context;
        }
    }