1

Я пытаюсь создать собственное представление для своего ListView, но при сбое приложения при попытке его открыть. Я читал много страниц, но не нашел решения. Пожалуйста, помогите мне!Android: java.lang.nullPointerException в пользовательском адаптере ListView

Это мой пользовательский адаптер:

public class AdaptadorCatalogo extends BaseAdapter { 
    protected Activity activity; 
    protected ArrayList<LineaCatalogo> items; 

    public AdaptadorCatalogo(Activity activity, ArrayList<LineaCatalogo> items) { 
    this.activity = activity; 
    this.items = items; 
    } 

    @Override 
    public int getCount() { 
    return items.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
    return items.get(position); 
    } 

    @Override 
    public long getItemId(int position){ 
    return 0; 
    } 

    @Override 
    public View getView(int position, View contentView, ViewGroup parent) { 
    View vi=contentView; 

    if(contentView == null) { 
     LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     vi = inflater.inflate(R.layout.listitem_catalogo, null); 
    } 

    LineaCatalogo item = items.get(position); 

    TextView primeraLinea = (TextView) vi.findViewById(R.id.lblPrimeraLinea); 
    primeraLinea.setText(item.getPrimeraLinea()); 

    TextView segundaLinea = (TextView) vi.findViewById(R.id.lblSegundaLinea); 
    segundaLinea.setText(item.getSegundaLinea()); 

    TextView magnitud = (TextView) vi.findViewById(R.id.lblMagnitud); 
    magnitud.setText(item.getMagnitud()); 

    return vi; 
    } 
} 

Это мой XML:

<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" 
    tools:context=".listaSismos" > 

<RelativeLayout 
    android:id="@+id/general" 
    style="@style/AppCentral" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:paddingLeft="50dp" > 

     <TextView 
     android:id="@+id/titulo_catalogo" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="30sp" 
     android:text="@string/esperando_info" /> 

     <ListView 
      android:id="@+id/listaDatos" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_marginBottom="50dp" 
      android:layout_marginTop="50dp" 
      android:layout_marginLeft="30dp" /> 


    </RelativeLayout> 
</RelativeLayout> 

Это моя активность:

public class listaSismos extends Activity { 

    private TextView tituloCatalogo; 
    private ListView listaDatos; 
    private String opcion; 
    private String codigoUsuario; 
    private String latitud; 
    private String longitud; 
    private String idioma; 
    private int difHoraria; 
    private ArrayList<LineaCatalogo> Catalogo; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.lista_sismos); 

     tituloCatalogo = (TextView)findViewById(R.id.titulo_catalogo); 
     listaDatos = (ListView)findViewById(R.id.listaDatos); 
     Bundle bundle = getIntent().getExtras(); 
     opcion = bundle.getString("lista"); 
     codigoUsuario = bundle.getString("codigoUsuario"); 
     latitud = bundle.getString("latitud"); 
     longitud = bundle.getString("longitud"); 
     idioma = getResources().getConfiguration().locale.toString(); 
     TimeZone defaultTZ = TimeZone.getDefault(); 
     difHoraria = defaultTZ.getRawOffset()/1000; 

     ListarCatalogo conexion = new ListarCatalogo(); 
     conexion.execute(); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    private class ListarCatalogo extends AsyncTask<String,Integer,Boolean> { 

     private int contador; 

     protected Boolean doInBackground(String... params) { 

      boolean resul = true; 

      HttpClient httpClient = new DefaultHttpClient(); 

      HttpGet del = 
        new HttpGet(my_app_server_url); 

      del.setHeader("content-type", "application/json"); 

      try 
      { 
       HttpResponse resp = httpClient.execute(del); 
       String respStr = EntityUtils.toString(resp.getEntity()); 

       JSONArray respJSON = new JSONArray(respStr); 

       ArrayList<LineaCatalogo> Catalogo = new ArrayList<LineaCatalogo>(); 
       contador = respJSON.length(); 

       for(int cont=0; cont<contador; cont++) 
       { 

        JSONObject obj = respJSON.getJSONObject(cont); 

        String tituloS = obj.getString("P"); 
        String subtituloS = obj.getString("S"); 
        String magnitudS = obj.getString("M"); 

        Catalogo.add(new LineaCatalogo(tituloS, subtituloS, magnitudS)); 

       } 

      } 
      catch(Exception ex) 
      { 
       resul = false; 
      } 

      return resul; 
     } 

     protected void onPostExecute(Boolean result) { 

      tituloCatalogo.setText(R.string.titulo_catalogo); 
      if (result) 
      { 

       //Rellenamos la lista con los resultados 
       AdaptadorCatalogo adaptador = new AdaptadorCatalogo(listaSismos.this, Catalogo); 

       listaDatos.setAdapter(adaptador); 

       tituloCatalogo.setText("OK"); 
      } else { 
       tituloCatalogo.setText(R.string.no_datos); 
      } 
     } 
    } 

} 

Если я закомментировать строку «listaDatos.setAdapter (adaptador) ", приложение работает нормально. Если нет, то я получаю эту LogCat:

12-06 09:34:32.443: W/dalvikvm(903): threadid=1: thread exiting with uncaught exception (group=0x41465700) 
12-06 09:34:32.559: E/AndroidRuntime(903): FATAL EXCEPTION: main 
12-06 09:34:32.559: E/AndroidRuntime(903): java.lang.NullPointerException 
12-06 09:34:32.559: E/AndroidRuntime(903): at com.tapsistemas.avcanquake.AdaptadorCatalogo.getCount(AdaptadorCatalogo.java:23) 
12-06 09:34:32.559: E/AndroidRuntime(903): at android.widget.ListView.setAdapter(ListView.java:463) 
12-06 09:34:32.559: E/AndroidRuntime(903): at com.tapsistemas.avcanquake.listaSismos$ListarCatalogo.onPostExecute(listaSismos.java:124) 
12-06 09:34:32.559: E/AndroidRuntime(903): at com.tapsistemas.avcanquake.listaSismos$ListarCatalogo.onPostExecute(listaSismos.java:1) 
12-06 09:34:32.559: E/AndroidRuntime(903): at android.os.AsyncTask.finish(AsyncTask.java:631) 
12-06 09:34:32.559: E/AndroidRuntime(903): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
12-06 09:34:32.559: E/AndroidRuntime(903): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
12-06 09:34:32.559: E/AndroidRuntime(903): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-06 09:34:32.559: E/AndroidRuntime(903): at android.os.Looper.loop(Looper.java:137) 
12-06 09:34:32.559: E/AndroidRuntime(903): at android.app.ActivityThread.main(ActivityThread.java:5103) 
12-06 09:34:32.559: E/AndroidRuntime(903): at java.lang.reflect.Method.invokeNative(Native Method) 
12-06 09:34:32.559: E/AndroidRuntime(903): at java.lang.reflect.Method.invoke(Method.java:525) 
12-06 09:34:32.559: E/AndroidRuntime(903): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
12-06 09:34:32.559: E/AndroidRuntime(903): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-06 09:34:32.559: E/AndroidRuntime(903): at dalvik.system.NativeStart.main(Native Method) 

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

+0

что линия 23 'AdaptadorCatalogo.java' – Raghunandan

+0

Ваши детали ArrayList является нулевым – viplezer

ответ

2

Declare и инициализировать как

private ArrayList<LineaCatalogo> Catalogo= new ArrayList<LineaCatalogo>(); 
@Override 
public void onCreate(Bundle savedInstanceState){ 

Удалить

ArrayList<LineaCatalogo> Catalogo = new ArrayList<LineaCatalogo>(); 
// becomes local to doInbackground as it is declared and initialized there. 

в doInbackground.

В вашем случае Catalogo был null.

1

Вы переопределять список с

ArrayList<LineaCatalogo> Catalogo = new ArrayList<LineaCatalogo>(); 

в использовании doInBacground

просто

Catalogo = new ArrayList<LineaCatalogo>(); 
Смежные вопросы