Android setText в ListView вызывает нулевой указатель

Вот моя проблема, я пытаюсь установить текст из ListView. Проблема в том, что я получу ошибку, потому что (согласно моим журналам) setContentView моей основной активности не совпадает с TextView, который я хочу установить из другого .xml (contactList.xml)

Активность вакансий (основная)

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.jobs);
    vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    TextView assigned = (TextView) findViewById(R.id.assigned);



    new ParseJobs().execute();

Метод ParseJobs()

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);



        if (ACKNOWLEDGED.contains("False")) {


            /** Updating parsed JSON data into ListView */
            ListAdapter adapter = new SimpleAdapter(Jobs.this, contactList, R.layout.list_item, new String[] { job, pays, ready_at }, new int[] { R.id.job1, R.id.pays1, R.id.ready_at1 });
            setListAdapter(adapter);        

            //TextView readyORdue = (TextView) findViewById(R.id.readyORdue);
            //readyORdue.setText("Ready At:");
        }

        if (ACKNOWLEDGED.contains("True")) {

            /** Updating parsed JSON data into ListView */
            ListAdapter adapter = new SimpleAdapter(Jobs.this, contactList, R.layout.list_item, new String[] { job, pays, due_by }, new int[] { R.id.job1, R.id.pays1, R.id.due_by1 });
            setListAdapter(adapter);    

            //TextView readyORdue = (TextView) findViewById(R.id.readyORdue);
            //readyORdue.setText("Due By:");
        }


        VerifyDriver.dismiss();

    }
}

Обратите внимание, что в моем методе ParseJobs я пытаюсь обновить TextView «readyORdue», но получаю сообщение об ошибке, потому что TextView принадлежит SimpleAdapter contactList.xml

Итак, мой вопрос: как мне установить текстовое представление текста из моего XML-макета списка контактов?

Вот мои журналы:

 07-17 15:55:16.703: W/dalvikvm(4387): threadid=1: thread exiting with uncaught exception (group=0x40015578)
 07-17 15:55:16.703: E/AndroidRuntime(4387): FATAL EXCEPTION: main
 07-17 15:55:16.703: E/AndroidRuntime(4387): java.lang.NullPointerException
 07-17 15:55:16.703: E/AndroidRuntime(4387):    at com.jetdelivery.mobile.Jobs$ParseJobs.onPostExecute(Jobs.java:287)
 07-17 15:55:16.703: E/AndroidRuntime(4387):    at com.jetdelivery.mobile.Jobs$ParseJobs.onPostExecute(Jobs.java:1)
 07-17 15:55:16.703: E/AndroidRuntime(4387):    at android.os.AsyncTask.finish(AsyncTask.java:417)
 07-17 15:55:16.703: E/AndroidRuntime(4387):    at android.os.AsyncTask.access$300(AsyncTask.java:127)
 07-17 15:55:16.703: E/AndroidRuntime(4387):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
 07-17 15:55:16.703: E/AndroidRuntime(4387):    at android.os.Handler.dispatchMessage(Handler.java:99)
 07-17 15:55:16.703: E/AndroidRuntime(4387):    at android.os.Looper.loop(Looper.java:130)
 07-17 15:55:16.703: E/AndroidRuntime(4387):    at android.app.ActivityThread.main(ActivityThread.java:3687)
 07-17 15:55:16.703: E/AndroidRuntime(4387):    at java.lang.reflect.Method.invokeNative(Native Method)
 07-17 15:55:16.703: E/AndroidRuntime(4387):    at java.lang.reflect.Method.invoke(Method.java:507)
07-17 15:55:16.703: E/AndroidRuntime(4387):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
07-17 15:55:16.703: E/AndroidRuntime(4387):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
07-17 15:55:16.703: E/AndroidRuntime(4387):     at dalvik.system.NativeStart.main(Native Method)

Строка 287: «readyORdue.setText («Готово в:»);»


person John Nguyen    schedule 17.07.2012    source источник
comment
Можете ли вы опубликовать LogCat с точной ошибкой? R.id.readyORdue — макет xml тоже поможет   -  person Maxim    schedule 18.07.2012
comment
Могу я задать только один вопрос? Почему вы пытаетесь установить адаптер в onPostExecute, также создавая его в потоке, отличном от вашего потока пользовательского интерфейса. Думая, что это может действительно сработать!   -  person Ahmed    schedule 18.07.2012
comment
Только что обновил свой пост с логами   -  person John Nguyen    schedule 18.07.2012
comment
мой адаптер действительно работает, они оба действительно работают, представление просто зависит от того, является ли строка ПОДТВЕРЖДЕНО истинной или ложной.   -  person John Nguyen    schedule 18.07.2012
comment
@JohnNguyen Ваш вопрос не ясен. Что на самом деле делает contactList.xml? Вы говорите, что readyORdue является его частью, но как оно отображается и где?   -  person Squonk    schedule 18.07.2012
comment
Если я вас правильно понял, если вы пытаетесь использовать другой файл макета (contactList XML), как вы описали, сначала вам нужно его раздуть. LayoutInflater inflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); View contactList= inflater.inflate(R.layout.some_layout, parent, false);   -  person Maxim    schedule 18.07.2012


Ответы (3)


Если вы хотите использовать другой файл макета «contactList.xml», как вы описали, сначала вам нужно его раздуть.

LayoutInflater inflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); 
View contactList= inflater.inflate(R.layout.contactList, false);

Теперь

TextView readyORdue = (TextView)contactList.findViewById(R.id.readyORdue);

предоставит вам необходимый TextView, добавьте это представление в какой-либо контейнер в вашем R.layout.jobs, чтобы сделать его видимым.

person Maxim    schedule 17.07.2012

setListAdapter - это что-то, связанное с ListActivity, а ListActivity имеет свой собственный контент макета, поэтому... вы не можете установитьContentView в ListActivity. Что вы можете сделать, так это создать свой собственный макет, который содержит список и назначенные TextView readyORdue и TextView и только одну вещь почему вы используете два, если? вы можете просто установить if(firstCondition) { .. }else...

person M'hamed    schedule 17.07.2012

Это в одном классе? Если это так, я бы определил readyORdue в вашем MainActivity. Ваши потоки не должны определять объекты пользовательского интерфейса, если вы можете этого избежать; вот почему у вас есть onCreate().

public class MainActivity {
    private TextView readyORDue;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.jobs);
        vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        TextView assigned = (TextView) findViewById(R.id.assigned);

        readyORDue = (TextView) findViewById(R.id.readyORdue);

        new ParseJobs().execute();
    }
}

Затем в вашем парсере

protected void onPostExecute(Void result) {
    super.onPostExecute(result);
    if (ACKNOWLEDGED.contains("False")) {


        /** Updating parsed JSON data into ListView */
        ListAdapter adapter = new SimpleAdapter(Jobs.this, contactList, R.layout.list_item, new String[] { job, pays, ready_at }, new int[] { R.id.job1, R.id.pays1, R.id.ready_at1 });
        setListAdapter(adapter);        

        readyORdue.setText("Ready At:");
    }

    if (ACKNOWLEDGED.contains("True")) {

        /** Updating parsed JSON data into ListView */
        ListAdapter adapter = new SimpleAdapter(Jobs.this, contactList, R.layout.list_item, new String[] { job, pays, due_by }, new int[] { R.id.job1, R.id.pays1, R.id.due_by1 });
        setListAdapter(adapter);    

        readyORdue.setText("Due By:");
    }


    VerifyDriver.dismiss();

}

Примечание: вам, вероятно, придется использовать runOnUiThread для ваших вызовов setText().

person cklab    schedule 17.07.2012