其中是在适配器中分配接口侦听器的正确位置



有时在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定义单独的类或在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);
}

以及在您的适配器类中

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

最新更新