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());
}
}