android 中的基本代码阅读

basic Code reading in android

这是 android 应用程序项目的一部分,我有这段代码 我无法理解 setOnItemClickListener 将 (AdapterView.OnItemClickListener listener) 作为参数,但其他方法 void onItemClick 也是在参数 space 中。我无法理解 AdapterView.OnItemClickListener() 的对象如何 calling/using onItemClick ?

  listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
            String forecast = mForecastAdapter.getItem(position);
            Intent intent = new Intent(getActivity(), MainActivity2Activity.class)
                    .putExtra(Intent.EXTRA_TEXT, forecast);
            startActivity(intent);
        }
    })

你必须熟悉匿名classes。

new AdapterView.OnItemClickListener(){...}

创建新的未命名(匿名)class 实现 AdapterView.OnItemClickListener 侦听器。 在括号内,您只需从接口实现方法。

new AdapterView.OnItemClickListener() {...}anonymous class. This is just a shortcut to implelenting AdapterView.OnItemClickListener interface and overriding onItemClick method manually (it is an abstract method) 的示例,然后实例化它并将对它的引用传递给 setOnItemClickListener 方法。在不使用匿名 class 的情况下,代码如下所示:

class MyOnItemClickListener implements AdapterView.OnItemClickListener{

    /**
     * Callback method to be invoked when an item in this AdapterView has
     * been clicked.
     * <p/>
     * Implementers can call getItemAtPosition(position) if they need
     * to access the data associated with the selected item.
     *
     * @param parent   The AdapterView where the click happened.
     * @param view     The view within the AdapterView that was clicked (this
     *                 will be a view provided by the adapter)
     * @param position The position of the view in the adapter.
     * @param id       The row id of the item that was clicked.
     */
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //your code here
    }
}

然后将其实例化并将其分配给您的 list view:

MyOnItemClickListener clickListener = new MyOnItemClickListener();
listView.setOnItemClickListener(clickListener);

这不是真正的 Android 问题 - 它是更基础的 Java 语法主题。你指的是Anonymous Class

setOnItemClickListener 方法接受 AdapterView.OnItemClickListener 对象作为参数。所以为了调用 setOnItemClickListener 你需要一个这样的监听器的实例。获得这样一个实例的一种方法是创建一个。

考虑以下示例:

class MyAwesomeListener implements AdapterView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
        //my awesome click handling logic
    }
}


.........
MyAwesomeListener listener = new MyAwesomeListener();
listView.setOnItemClickListener(listener);

我在这里创建了一个自定义 class class 实现了 AdapterView.OnItemClickListener 接口。由于它是 AdapterView.OnItemClickListener 的实例,我可以将此实例作为方法参数传递给 setOnItemClickListener 方法。

作为替代方案,我可以这样调用 setOnItemClickListener

listView.setOnItemClickListener(new MyAwesomeListener());

在这种情况下,我不需要创建额外的变量。

但您可以走得更远 - 您可以通过使用匿名 class:

来避免创建实现 AdapterView.OnItemClickListener 的自定义 class
listView.setOnItemClickListener(new AdapterView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
        //my awesome click handling logic
    }
);

所以在这种情况下,我在设置侦听器时创建了 AdapterView.OnItemClickListener 的自定义实现。所以这只是上述两种方法的简化版本。