在MainActivity之外使用arrayAdapter

时间:2015-02-17 20:52:55

标签: java android multithreading performance android-layout

我一直在尝试在名为Client()的类中使用我的主要活动之外的arrayAdapter。我意识到arrayAdapter的构造函数是ArrayAdapter(context,layout_id,textview_id,items),所以我已经从mainActivity传递到我的Client类的构造函数中。对于layout_id我明白它必须是一个textView id,所以我将一个任意textview从mainActivity传递到ArrayAdapter构造函数,然后尝试通过这样的处理程序更新UI:

adapter = new ArrayAdapter<String>(context, textView.getId(), clients);
mHandler.post(new Runnable() {
    @Override
    public void run() {

        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
});

我最有可能收到以下错误,我已经通过了textView Id。

 1340-1340/package E/AndroidRuntime﹕ FATAL EXCEPTION: main
android.content.res.Resources$NotFoundException: Resource ID #0x7f080040 type #0x12 is not valid

我知道如果我从一个活动中做到这一点我可以像这样传递它:

adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, fileNames);
    listView.setAdapter(adapter);

但我如何在Activity之外执行此操作?

编辑:额外信息: 我在我的activity_main里面有我的textView,如下所示:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">



<ListView
    android:id="@+id/listview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:divider="#000000"
    android:dividerHeight="5dp"
    android:paddingLeft="1dp"
    />

<TextView
    android:layout_width="fill_parent"
    android:layout_height="80dp"
    android:text="New Text"
    android:id="@+id/textView"
    android:layout_alignTop="@+id/listview"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

我在MainActivity.java中得到了textView,如下所示:

 TextView tv = (TextView) findViewById(R.id.textView);

然后将它传递到我的客户端类中:

 cThread = new Client(ip, port, context, activity, mHandler, listView, tv);

2 个答案:

答案 0 :(得分:1)

在你的问题中,你引用了一个构造函数: ArrayAdapter(Context context,int resource,int textViewResourceId,List objects)

但在您的代码中,您正在使用另一个 ArrayAdapter(Context context,int resource,T [] objects)

您正在使用的那个期望布局资源ID而不是视图ID。

!!小心,我不知道你的意思是什么&#34;任意的textview id&#34;但是textview必须存在于用于实例化arrayAdpater的布局中。

答案 1 :(得分:0)

您只需在代码的第一行中将<{1}} 替换为 textView.getId()