Подтвердить что ты не робот

NullPointerException для виджета android ArrayAdapter createViewFromResource

Я новичок в Andrey ArrayAdapters, и перед заполнением ListView я столкнулся с исключительным исключением. Данные, которые я использовал для заполнения списка, не являются нулевыми, я проверил это. Кроме того, все работает отлично при первой загрузке, но как только я прокручу вниз до конца списка, приложение выйдет из строя.

Вот моя трассировка стека:

E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
        at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
        at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
        at android.widget.AbsListView.obtainView(AbsListView.java:2386)
        at android.widget.ListView.makeAndAddView(ListView.java:1769)
        at android.widget.ListView.fillDown(ListView.java:672)
        at android.widget.ListView.fillGap(ListView.java:636)
        at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5201)
        at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4358)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
        at android.view.Choreographer.doCallbacks(Choreographer.java:555)
        at android.view.Choreographer.doFrame(Choreographer.java:524)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5059)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
        at dalvik.system.NativeStart.main(Native Method)

и здесь мой код активности: "Я пометил строку, в которой я заполняю listView"

public class AddPersonActivity extends Activity
    implements
    PlusClient.OnPeopleLoadedListener,
    PlusClient.ConnectionCallbacks,
    PlusClient.OnConnectionFailedListener {

private static final String TAG = "AddPersonActivity";

private static final String STATE_RESOLVING_ERROR = "resolving_error";

private ArrayAdapter sListAdapter;
private ListView sPersonListView;
private ArrayList<String> sListItems;
private PlusClient sPlusClient;
private boolean sResolvingError;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_person);
    Log.d(TAG, "onCreate called");
    sPlusClient = new PlusClient.Builder(this, this, this)
            .setActions(MomentUtil.ACTIONS)
            .build();

    sListItems = new ArrayList<String>();
    sListAdapter = new ArrayAdapter<String>(
            this,
            android.R.layout.simple_list_item_1, sListItems);
    sPersonListView = (ListView) findViewById(R.id.person_list);
    sPersonListView.setAdapter(sListAdapter);
    sResolvingError = savedInstanceState != null
            && savedInstanceState.getBoolean(STATE_RESOLVING_ERROR, false);
}

@Override
public void onStart() {
    super.onStart();
    Log.d(TAG, "onStart : connecting PlusClient");
    sPlusClient.connect();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(STATE_RESOLVING_ERROR, sResolvingError);
}

@Override
public void onStop() {
    super.onStop();
    Log.d(TAG, "onStop : disconnecting PlusClient");
    sPlusClient.disconnect();
}

@Override
public void onConnected(Bundle bundle) {
    Log.d(TAG, "onConnected : PlusClient connected");
    sPlusClient.loadVisiblePeople(this, null);
}

@Override
public void onDisconnected() {
    Log.d(TAG, "onDisconnected : PlusClient re-connect, PersonListView null");
    sPlusClient.connect();
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    Log.d(TAG, "onConnectionFailed : connecting PlusClient");
    sPlusClient.connect();
}

@Override
public void onPeopleLoaded(ConnectionResult connectionResult, PersonBuffer persons, String s) {
    Log.d(TAG, "onPersonLoaded called");
    switch (connectionResult.getErrorCode()) {
        case ConnectionResult.SUCCESS:
            sListItems.clear();
            Log.d(TAG, "Loading People");
            try {
                int count = persons.getCount();
                Log.d(TAG, String.valueOf(count));
                for (int i = 0; i < count; i++) {
                    /*====== this is where listView is populated =====*/
                    sListItems.add(persons.get(i).getDisplayName());
                }
            } finally {
                persons.close();
            }

            sListAdapter.notifyDataSetChanged();
            break;

        case ConnectionResult.SIGN_IN_REQUIRED:
            sPlusClient.disconnect();
            sPlusClient.connect();
            break;

        default:
            Log.e(TAG, "Error when listing people: " + connectionResult);
            break;
    }
}
}

Я попытался выполнить регистрацию на каждом этапе, чтобы найти точную строку, которая может быть причиной этого, но я ничего не могу найти. Было бы очень полезно, если бы кто-нибудь мог сообщить мне, что я делаю неправильно.

Спасибо заранее!

4b9b3361

Ответ 1

Я думаю, что один из элементов в вашем ArrayList равен null. Вот почему он дает NullPointerException при прокрутке вниз до этого элемента. Было бы лучше, если вы проверите, если какой-либо элемент имеет значение null, прежде чем добавлять его в ListView.

int count = persons.getCount();
         Log.d(TAG, String.valueOf(count));
         for (int i = 0; i < count; i++) {
             /*====== this is where listView is populated =====*/
             if(persons.get(i).getDisplayName() != null) {
             sListItems.add(persons.get(i).getDisplayName());
             }
         }

Ответ 2

Поскольку вы упомянули, что список заполняется при первой загрузке. Это происходит только тогда, когда происходит прокрутка, приложение падает. Один из пунктов списка ваших лиц null.