在实例化之后使用接口的方法而不编写任何代码

时间:2015-12-24 13:43:24

标签: java android interface

我正在通过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);
};

我是否严重误解了界面问题?

1 个答案:

答案 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可用于执行该接口的任何方法。