如何使用Kotlin从非活动类中查找ListView?

时间:2018-09-19 10:04:13

标签: android kotlin

在我的MainActivity中,如果我导入:

import kotlinx.android.synthetic.main.activity_main.*

我可以简单地找到我的ListView并像这样设置onItemClickListener

list_view.onItemClickListener

但是在非活动课程中我该怎么做?

编辑:

fun setListViewElements() {
    list_view.adapter = arrayAdapter
    list_view.onItemClickListener = AdapterView.OnItemClickListener {}
}

3 个答案:

答案 0 :(得分:0)

here所述;

您必须通过构造函数传递Context引用。

public class ClassB {
   Context context;
   public ClassB(Context context){
     this.context=context;
   }

   public void Update(){
        TextView txtView = (TextView) ((Activity)context).findViewById(R.id.text);
        txtView.setText("Hello");
   }
}

答案 1 :(得分:0)

您可以像这样将listView作为类的constuctor参数传递:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView listView = findViewById(R.id.listview);

        ClassExample classExample = new ClassExample(listView);

    }

然后:

class ClassExample {

        ListView listView;
        public ClassExample(ListView listView){
            this.listView = listView;
        }

    }

希望这会有所帮助

答案 2 :(得分:0)

您可以使用findViewById插件和kotlin-android-extensions界面访问没有LayoutContainer的视图。

在您的build.gradle文件中,确保您应用了插件并设置了实验性标志:

apply plugin: 'kotlin-android-extensions'

androidExtensions {
    experimental = true
}

您要从其访问list_view的类需要实现LayoutContainer接口。实现该接口意味着您需要提供一个容器视图,可以在其中找到您的ListView

现在让我们假设我们有一个用于MainActivity的简单布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

在我们的MainActivity中,我们将此文件与setContentView一起使用。

现在您可以编写一个非活动但可以使用视图的类(在本示例中为TextView),而无需使用findViewById

package com.example.playground

import android.view.View
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.activity_main.*

class Demo(override val containerView: View?) : LayoutContainer {

    fun setTextViewText(text: String) {
        text_view.text = text
    }

}

该类实现LayoutContainer(只有首先启用实验功能才有可能),因此需要提供containerView属性,该属性是通过构造函数获取的。

现在可以使用此类,例如从一个活动中,您将需要对其进行实例化并为其提供存在text_view的视图(在我的情况下,其ID为LinearLayout的{​​{1}}):

container

如果不提供容器,将无法使用val demo = Demo(container) demo.setTextViewText("Magic!") -magic。因为从本质上讲,在后台发生的事情是,如果您访问kotlinx.android.synthetic,则扩展名将执行list_view

在线您可以从Kotlin about the Android plugin和有关how to use the Android extensions的其他信息中找到。

相关问题