Android - Excepción de puntero nulo ListView con adaptador base

Estoy trabajando en un puerto para Android de un proyecto de iOS lanzado anteriormente que terminé recientemente. Esta aplicación analiza XML de un sitio y completa el texto de los elementos XML en un ListView. Tengo la porción de análisis XML sin problemas. El problema con el que me encuentro es con la carga de estos datos en ListView. Tengo un adaptador personalizado para manejar el texto y el botón que se completará en cada fila, pero la aplicación falla en la línea donde configuré el adaptador: lv.setAdapter (adap). El error es una excepción de puntero nulo. Error y código a continuación. Creo que me falta un paso con ListView y el adaptador. También verifiqué que mi ArrayList menuItems tiene datos y no es nulo. Cualquier aporte, orientación o comentario que pueda obtener sobre esto sería muy apreciado.

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to startactivity 
ComponentInfo{tv.undignified.android/tv.undignified.android.Undignified}:     
java.lang.RuntimeException: Unable to start activity ComponentInfo{tv.undignified.android/ java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{tv.undignified.android/tv.undignified.android.Podcasts}: java.lang.NullPointerException

Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{tv.undignified.android/tv.undignified.android.Podcasts}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
at android.app.ActivityThread.startActivityNow(ActivityThread.java:2503)
at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:651)
at android.widget.TabHost.setCurrentTab(TabHost.java:323)
at android.widget.TabHost.addTab(TabHost.java:213)
at tv.undignified.android.Undignified.onCreate(Undignified.java:48)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)

Código principal:

public class Podcasts extends ListActivity{

    private static final String HASHMAP_ID = "_id";
    private CustomAdapter adap;

    static final String URL = "http://www.undignified.podbean.com/feed";

    //XML Node Keys
    static final String KEY_ITEM  = "item";
    static final String KEY_TITLE = "title";
    static final String KEY_DESCRIPTION = "itunes:subtitle";
    static final String KEY_PODCASTURL = "enclosure";

    public static final  ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 

        setContentView(R.layout.podcasts); 



        UndigParser uparser = new UndigParser();

        String xml = uparser.getXmlFromURL(URL);        

        Document doc = uparser.getDomElement(xml);    

        NodeList nl = doc.getElementsByTagName(KEY_ITEM);

        for(int i = 0; i < nl.getLength(); i++){

            HashMap<String, String> map = new HashMap<String, String>();
            Element e = (Element) nl.item(i);


            map.put(KEY_TITLE, uparser.getValue(e, KEY_TITLE));
            map.put(KEY_DESCRIPTION, uparser.getValue(e, KEY_DESCRIPTION));
            map.put(KEY_PODCASTURL, uparser.getValue(e, KEY_PODCASTURL));



            menuItems.add(map);
        }

        adap = new CustomAdapter(Podcasts.this, menuItems);           
       ListView lv = (ListView) findViewById(R.id.LinearLayout01);

       lv.setAdapter(adap);


    }

    public static class CustomAdapter extends BaseAdapter implements Filterable{

        private LayoutInflater mInflater;
        private Context context;


        public CustomAdapter(Context context, ArrayList<HashMap<String,String>>menuItems){

            mInflater = LayoutInflater.from(context);
            this.context = context;
        }

        public View getView(final int position, View convertView, ViewGroup parent){
            ViewHolder holder;

                convertView = mInflater.inflate(R.layout.list_item, null);

                holder = new ViewHolder();
                holder.description=(TextView)convertView.findViewById(R.id.description);
                holder.podcasturl=(TextView)convertView.findViewById(R.id.podcasturl);
                holder.title=(TextView)convertView.findViewById(R.id.title);
                holder.downloadBTN=(Button)convertView.findViewById(R.id.btnStartDownload);

                convertView.setOnClickListener(new OnClickListener(){
                    private int pos = position;

                    @Override
                    public void onClick(View v){
                        Toast.makeText(context, "Text-" + String.valueOf(pos), Toast.LENGTH_SHORT).show();
                    }
                });

                holder.downloadBTN.setOnClickListener(new OnClickListener(){
                    private int pos = position;

                    @Override
                    public void onClick(View v){
                        Toast.makeText(context, "Button-"+String.valueOf(pos), Toast.LENGTH_SHORT).show();
                    }
                });
                convertView.setTag(holder);
            return convertView;
        }

        static class ViewHolder{
            TextView description;
            TextView title;
            TextView podcasturl;
            Button downloadBTN;
        }

        @Override
        public int getCount() {

            Log.d("Sizetest2343",""+menuItems.size());
            return menuItems.size();
        }

        @Override
        public Object getItem(int position) {

            return null;
        }

        @Override
        public long getItemId(int position) {

            return position;
        }

        @Override
        public Filter getFilter() {
            return null;
        }
    }

 }

El list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="5dip">

<LinearLayout
    android:id="@+id/LinearLayout01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <Button
        android:id="@+id/startPodcastDownload"
        android:layout_width="50dip"
        android:layout_height="50dip"
        android:focusable="false"
        android:text="Download Podcast"> 
    </Button>        


</LinearLayout>    
        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/LinearLayout01"
            android:textColor="#acacac"
            android:paddingBottom="2dip">
        </TextView>
        <TextView
            android:id="@+id/description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/LinearLayout01"
            android:layout_below="@id/title"
            android:textColor="#acacac"
            android:paddingBottom="2dip">
        </TextView>
        <TextView
            android:id="@+id/podcasturl"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/LinearLayout01"
            android:layout_below="@+id/description"
            android:textColor="#acacac"
            android:paddingBottom="2dip">
        </TextView>

</RelativeLayout>

preguntado el 27 de julio de 12 a las 19:07

¿Cuándo te da el error? ¿Es cuando ejecutas la aplicación o cuando haces clic en algo? Además, no tienes la onCreate método anulado, ¿es solo un error cuando movió el código o no tiene la anotación de anulación en el método? -

Para responder a esta pregunta, sí, eliminé accidentalmente @Override al mover un código. Lo he vuelto a colocar encima del método onCreate. -

1 Respuestas

Creo que parte del problema podría ser su línea de código:

ListView lv = (ListView) findViewById(R.id.LinearLayout01);

Aquí, está tratando de hacer un ListView desde un LinearLayout. Por lo general, tendría algo como esto en mi diseño:

<ListView android:id="@id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="0dip"
    android:layout_weight="0.7" />

Luego inflas la vista de lista en tu actividad, así:

ListView friendList = (ListView)findViewById(android.R.id.list);

Es importante usar el parámetro android.R.id.list.

Respondido 27 Jul 12, 20:07

Es la forma recomendada de configurar un ListView al tener un archivo XML con solo el sección y luego cree otro archivo de diseño XML con el , , , etc? ¿O es más sencillo poner el en el mismo archivo de diseño? - Fostenador

Debe crear un diseño de vista de lista en un archivo xml separado, luego llamarlo desde su xml original, como se sugirió anteriormente: BlackHatSamurai

Sí, además, suelo crear ListAdapters personalizados para hacer todo el diseño y le paso el int layoutResource al constructor. - juan j smith

Gracias por toda la respuesta. Estaba teniendo algunos problemas al configurar R.id.list en el ID de ListView. Tuve un error tipográfico en podcasts.xml y es por eso que no pude recoger este atributo. Lo corregí y configuré Listview lv = (ListView) findViewById (R.id.list) de manera adecuada. Sin embargo, recibo un nuevo error: java.lang.RuntimeException: su contenido debe tener un ListView cuyo atributo de identificación sea "android.R.id.list". id="@+id/lista" - Fostenador

Actualicé mi respuesta, ya que era probable que se quedara sin comentarios :-) - juan j smith

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.