我正在通过Android在线课程,我对代码有一些疑问,特别是有关接口的问题。
守则:
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) {
}
}
从上面的代码片段中,我们实现了recyclelerview的监听器,我们使用2个方法和OnItemClickListener类型的变量mListener(接口)创建了一个OnItemClickListener接口。
根据我对接口的理解,来自http://www.dummies.com/how-to/content/what-is-an-interface-in-java.html&amp; Is there more to an interface than having the correct methods,我知道在实现接口时必须实现接口中定义的方法。
但是,在代码片段中,我们实际上能够创建一个OnItemClickListener类型的变量(接口)?
的Qn1。
我是否假设通过创建一个接口变量来实际实现它?
QN2。
我实际上不必实现onItemClick&amp;的方法。 onItemLongClick在界面?我说这是因为当我注释掉我不确定的代码行之一时,我没有从android studio中得到任何错误
Qn 3。
使用以下代码行
mListener.onItemClick(childview,recyclerView.getChildAdapterPosition(childview));
我们在实例化方法时,为什么我们不能实际编写方法的代码体呢?
E.g
mListener.onItemClick(childview,recyclerView.getChildAdapterPosition(childview)){
//Enter code here for handling the actual item click
//For example, textView.setText(text);
};
我是否严重误解了界面问题?
答案 0 :(得分:3)
我是否假设通过创建一个接口变量来实际实现它?
不,该变量包含null
,直到您为其分配实现该接口的类的实例,您在该行中进行操作 - mListener = listener;
。
我实际上不必实现onItemClick&amp;的方法。 onItemLongClick在界面?
您发布的代码中没有任何地方是您实现OnItemClickListener
界面。当您创建实现该接口的类时,您将必须实现其所有方法(除非该类是抽象的)。
关于最后一个问题:
public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
mListener = listener;
...
您的RecyclerItemClickListener
构造函数接受listener
参数,该参数是对实现OnItemClickListener
的类实例的引用,因此实现了该接口的所有方法。然后它将其分配给mListener
,因此mListener
可用于执行该接口的任何方法。