tutorial studio llenar ejemplo custom activity android android-layout android-listview android-arrayadapter

llenar - listview android studio



NullPointerException en el widget de Android ArrayAdapter createViewFromResource (2)

Como mencionó que la lista se llena en la primera carga. Solo cuando se produce el desplazamiento, la aplicación falla. Uno de los artículos en su lista de personas es null .

Soy nuevo en ArrayAdapters de Android y estoy enfrentando una excepción de puntero nulo al completar mi ListView. Los datos que utilicé para poblar la vista de lista no son nulos, lo había comprobado. También todo está funcionando bien en la primera carga, pero una vez que me desplazo hacia abajo hasta el final de la lista, la aplicación se bloquea.

Aquí está mi rastro de pila:

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)

y aquí está mi código de actividad: "He marcado la línea donde estoy poblando el 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; } } }

Intenté iniciar sesión en cada etapa para encontrar la línea exacta que podría estar causando esto, pero no hay nada que pueda encontrar. Sería de gran ayuda si alguien pudiera decirme qué estoy haciendo mal.

¡¡¡Gracias por adelantado!!!


Creo que uno de los elementos en su ArrayList es nulo. Es por eso que está dando NullPointerException cuando se desplaza hacia abajo a ese elemento. Sería mejor si comprueba si algún elemento es nulo antes de agregarlo a 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()); } }