2015-02-17 4 views
0

Я пытаюсь использовать arrayAdapter за пределами моей основной деятельности в классе Client(). Я понимаю, что конструктором для arrayAdapter является ArrayAdapter (context, layout_id, textview_id, items), поэтому я прошел в контексте из mainActivity в конструктор для моего класса Client. Для layout_id я понимаю, что он должен быть TextView идентификатор, так что я прошел произвольный TextView из mainActivity в конструктор ArrayAdapter затем попытался обновить пользовательский интерфейс с помощью обработчика, как это:Использование arrayAdapter за пределами MainActivity

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

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

я получаю следующее сообщение об ошибке скорее всего, как я прошел идентификатор textView.

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?

EDIT: Дополнительные информации: у меня TextView в моем activity_main так:

<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" /> 

Я получаю TextView в моем MainActivity.java так:

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

Затем проденьте в мой клиентский класс следующим образом:

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

Это не элемент ID изнутри зрения. Это идентификатор макета файла макета, который будет представлять каждую строку. – DeeV

+0

Опубликовать больше кода. Вы используете перегруженный метод - и вы думаете, что передаете объект, но он считает, что это ссылочный ID – Jim

+0

. Я не думаю, что есть хорошее и безопасное решение для заполнения списка за пределами активности, потому что это не очень хорошо практика. Можете ли вы сделать то, что вам нужно сделать в вашем клиенте, а затем вернуться к своей деятельности с помощью списка ваших товаров с помощью обратного вызова? –

ответ

1

В вас вопрос вы ссылаетесь один конструктор: ArrayAdapter (контекст Context, внутр ресурс, внутр textViewResourceId, Список объектов)

, но в своем коде вы используете другой
ArrayAdapter (контекст Context, внутр ресурс, T [] объектов)

Тот, который вы используете, рассчитывает идентификатор ресурса макета, а не идентификатор вида.

Будьте осторожны, я не знаю, что вы подразумеваете под «произвольным идентификатором текста», но текстовое представление должно существовать в макете, который вы используете для создания экземпляра массиваAdpater.

0

Привет просто заменить textView.getId()наR.id.textView в первой строке кода

Смежные вопросы