【发布时间】:2015-12-24 13:43:24
【问题描述】:
我正在通过在线 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) {
}
}
从上面的代码截图中,我们为回收视图实现了一个监听器,我们创建了一个接口 OnItemClickListener,它有 2 个方法和一个类型为 OnItemClickListener(接口)的变量 mListener。
根据我对接口的理解,从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,我知道接口中定义的方法必须在实现接口时实现。
但是,在sn-p代码中,我们实际上可以创建一个OnItemClickListener(接口)类型的变量吗?
Qn1.
我是否假设通过创建一个接口变量我实际上正在实现它?
Qn2.
我实际上不必在界面中实现 onItemClick 和 onItemLongClick 方法?我这样说是因为当我注释掉我不确定的代码行之一时,我没有收到来自 android studio 的任何错误
Qn 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);
};
我是否对接口有严重误解?
【问题讨论】: