java - 实例化接口(interface)后无需编写任何代码即可使用接口(interface)的方法

标签 java android interface

我正在学习 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/

相关文章:

java - 从对象启动 Activity

java - 从 Firebase 读取数据并将其保存在数组列表中

C# 实现接口(interface)定义的派生类型?

database - 如何在3个步骤中处理多个页面以保存用户数据,其中每个步骤都是一个新界面,然后将它们保存在一起?

c# - 继承接口(interface)方法的重新实现

java - 如何在 webapp 中实际连接事物

java - 特定国家/地区的动态日期和时间

java - 安装Elasticsearch 5.5 启动服务失败

android - 删除最后一项时 Recyclerview 崩溃。 NullPointerException : android. View .ViewGroup$LayoutParams android.view.View.getLayoutParams()

java - 无法获取经纬度android