【问题标题】:Using an interface's method without writing any code after instantiating it实例化后使用接口的方法而不编写任何代码
【发布时间】: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);
};

我是否对接口有严重误解?

【问题讨论】:

    标签: java android interface


    【解决方案1】:

    我是否通过创建一个接口变量来假设我实际上正在实现它?

    不,该变量包含null,直到您为其分配一个实现该接口的类的实例,您在行中执行该操作 - mListener = listener;

    我其实不用在界面中实现onItemClick & onItemLongClick这两个方法?

    您发布的代码中没有任何地方实现OnItemClickListener 接口。当您创建实现该接口的类时,您必须实现其所有方法(除非该类是抽象的)。

    至于最后一个问题:

    public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
        mListener = listener;
        ...
    

    您的RecyclerItemClickListener 构造函数接受listener 参数,该参数是对实现OnItemClickListener 的类实例的引用,因此实现了该接口的所有方法。然后将其分配给mListener,因此mListener 可用于执行该接口的任何方法。

    【讨论】:

    • 感谢您抽出宝贵时间来回答,只是为了澄清一下,我是否正确地说,因为 mListener 变量被分配了 listener 的值,它是实现 OnItemClickListener 的类 (A) 的一个实例,当我调用行 mListener.onItemLongClick 时,我实际上是在调用类 A 中定义的 onItemLongClick 方法,以及它的所有相关代码。(例如,用于处理 itemlongclick?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2012-03-13
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    相关资源
    最近更新 更多