我正在学习 Android 在线类(class),我对代码有一些疑问,特别是关于接口(interface)的问题。
代码:
package com.test.personalnotes;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
/**
* Created by Admin on 24/12/15.
*/
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
public static interface OnItemClickListener {
public void onItemClick(View view, int position);
public void onItemLongClick(View view, int position);
}
private OnItemClickListener mListener; <-- An interface variable..?
private GestureDetector mGestureDetector;
public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
public void onLongPress(MotionEvent motionEvent) {
//Gets the childview of the recyclerview (I.e What is beneath the area which was pressed)
View childView = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY());
if (childView != null && mListener != null) {
mListener.onItemLongClick(childView, recyclerView.getChildAdapterPosition(childView)); <-- Code i'm unsure of No.1
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
View childview = recyclerView.findChildViewUnder(motionEvent.getX(),motionEvent.getY());
//If there is something under the area tapped,mListener is not ull and a touch event was registered
if(childview != null && mListener != null && mGestureDetector.onTouchEvent(motionEvent)){
mListener.onItemClick(childview,recyclerView.getChildAdapterPosition(childview)); <-- Code i'm unsure of No.2
}
return false;
}
@Override
public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
从上面的代码 fragment 中,我们为 recyclerview 实现一个监听器,我们创建了一个具有 2 个方法的 OnItemClickListener 接口(interface)和一个 OnItemClickListener 类型的变量 mListener(接口(interface))。
据我对接口(interface)的理解,来自http://www.dummies.com/how-to/content/what-is-an-interface-in-java.html & Is there more to an interface than having the correct methods ,我知道接口(interface)中定义的方法必须在实现接口(interface)时实现。
但是,在代码 fragment 中,我们实际上能够创建一个OnItemClickListener(接口(interface))类型的变量吗?
Qn1。
我是否假设通过创建接口(interface)变量我实际上正在实现它?
Qn2。
我实际上不必在界面中实现 onItemClick 和 onItemLongClick 方法?我这样说是因为当我注释掉我不确定的一行代码时,我没有从 android studio 收到任何错误
问题 3。
使用以下代码行,
mListener.onItemClick(childview,recyclerView.getChildAdapterPosition(childview));
在我们实例化该方法的地方,为什么我们能够在不实际编写该方法的代码主体的情况下这样做?
例如
mListener.onItemClick(childview,recyclerView.getChildAdapterPosition(childview)){
//Enter code here for handling the actual item click
//For example, textView.setText(text);
};
我是否对接口(interface)有严重误解?
最佳答案
Do i assume the by creating an interface variable i am actually implementing it?
不,该变量将包含null
,直到您将实现该接口(interface)的类的实例分配给它,您可以在 - mListener =listener;
行中执行此操作。
I do not actually have to implement the methods onItemClick & onItemLongClick in the interface?
您发布的代码中没有任何地方实现 OnItemClickListener
接口(interface)。当您创建一个实现该接口(interface)的类时,您必须实现它的所有方法(除非该类是抽象的)。
至于最后一个问题:
public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
mListener = listener;
...
您的 RecyclerItemClickListener
构造函数接受 listener
参数,该参数是对实现 OnItemClickListener
的类实例的引用,因此实现了所有该接口(interface)的方法。然后将其分配给 mListener
,因此 mListener
可用于执行该接口(interface)的任何方法。
关于java - 实例化接口(interface)后无需编写任何代码即可使用接口(interface)的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34453743/