Necesito ayuda con un list view personalizado

  • Respuestas:9
  • AbiertoSin chinchetaSin solución
  • Posts del Foro: 5

14-nov-2016 11:06:53 vía Web

El caso es que estoy desarrollando una aplicacion movil, la cual tiene un login y ese login accede a un menu desplegable al que si pincho añadir me sale un activity con cuatro botones y cada boton lleva a otra actividad donde tengo un list view. El caso es que el listview personalizado lo muestra pero la aplicacion revienta y no se por que.

Adjunto la clase principal,los layouts y el adapter

adapter

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

public class ItemListAdapter extends BaseAdapter {

Context context;
ArrayList<Item> item;
Cabecera cabecera;
Item items;
LayoutInflater inflater;


// este es el constructor del adapter
public ItemListAdapter (Context context,ArrayList<Item>item) {
    this.context=context;
    this.item=item;
}

@Override
public int getCount() {
   return 55;
}

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

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

@Override
public View getView(int posicion, View convertView, ViewGroup parent) {
    cabecera = new Cabecera();
    View view = convertView;
    if (view == null) {
        LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = li.inflate(R.layout.list_item, parent, false);
    }
    cabecera.setTvPregunta((TextView) view.findViewById(R.id.tvPregunta));
    view.setTag(cabecera);
    items = new Item();
    cabecera.getTvPregunta().setText(items.getPregunta());
    //cabecera.getEtRespuesta().setText(item);*/
    return view;
}

public static class Cabecera {
    TextView tvRespuesta;

    public TextView getTvPregunta() {
        return tvRespuesta;
    }

    public void setTvPregunta(TextView tvPregunta) {
        this.tvRespuesta = tvPregunta;
    }

}

}

clase donde llamo al adapter

import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ListView;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.TextHttpResponseHandler;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.util.ArrayList;
import java.util.Arrays;

import cz.msebera.android.httpclient.Header;

public class Analisis extends AppCompatActivity {

ArrayList<Item> items;
static String jsonString = "";
static String preguntas []= null;
Context context;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.activity_analisis);
    FrameLayout contenedor = (FrameLayout) findViewById(R.id.activity_analisis);
    LayoutInflater inflater = LayoutInflater.from(this);
    View laViewInflada = inflater.inflate(R.layout.list_item, contenedor, true);
    invokeWS();
}

// Este metodo es el que conecta con el servidor
public void invokeWS(){
    AsyncHttpClient client = new AsyncHttpClient();
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    //esta linea conecta con el servidor y mediante un get recoge todas las preguntas
    client.get("nombreurl", new TextHttpResponseHandler() {
        // este metodo recoge los status del servidor en el caso de fallar salen alguno de estos errores
        @Override
        public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
            if (statusCode == 400) {
                builder.setTitle("Faltan datos");
                builder.setMessage("Introduzca los datos requeridos")
                        .setPositiveButton("Cerrar", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // User cancelled the dialog
                            }
                        });


                builder.show();
            } else if (statusCode == 404) {

                builder.setTitle("Error inesperado");
                builder.setMessage("Fallo al conectarse a internet o el servidor no esta disponible en este momento \n Disculpe las molestias")
                        .setPositiveButton("Cerrar", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // User cancelled the dialog
                            }
                        });

                builder.show();

            }else if(statusCode == 401){
                builder.setTitle("Error al iniciar sesión");
                builder.setMessage("El usuario o contraseña son erroneos")
                        .setPositiveButton("Cerrar", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // User cancelled the dialog
                            }
                        });


                builder.show();


            }
        }

        //Si la conexion falla
        //Si se establece conexion
        @Override
        public void onSuccess(int statusCode, Header[] headers, String responseString) {
            JSONArray genreArray = null;
            jsonString = responseString;
            ItemListAdapter adapter;
            ListView lv_lista;
            lv_lista = (ListView) findViewById(R.id.lvAnalisis);
            ArrayList<Item> array_items = new ArrayList<Item>();
            //Aqui creo un json object que luego despues parseo para poder guardar los elementos en un array
            JSONObject object = null;
            Log.d("onSuccess: ", jsonString);
            JSONParser parser = new JSONParser();
            Object obj = null;
            try {
                obj = parser.parse(jsonString);
                object = (JSONObject) obj;
                genreArray = (JSONArray) object.get("results");
                int i;
                JSONObject ary;
                preguntas= new String[genreArray.size()];
                for(i = 0; i<genreArray.size();i++){
                    ary= (JSONObject) genreArray.get(i);
                    //System.out.println((String) ary.get("pregunta"));
                    preguntas[i]=(String) ary.get("pregunta");

                }
                System.out.println("nuevo array");
                System.out.println(items);
                System.out.println( Arrays.toString(preguntas));

                lv_lista.setAdapter(new ItemListAdapter(context,items));
            } catch (ParseException e) {
                e.printStackTrace();
            }

            // aqui llamo al adapter



        }

    });

}

}

layout principal

android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/oesia">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:background="@color/oesia">

            <TableLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <TableRow
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" >

                    <EditText
                        android:layout_height="wrap_content"
                        android:inputType="textPersonName"
                        android:ems="10"
                        android:id="@+id/etCliente"
                        android:hint="Cliente"
                        android:layout_marginTop="30dp"
                        android:layout_marginLeft="30dp"
                        android:layout_marginBottom="20dp"
                        android:layout_width="match_parent"
                        android:textColor="#000"
                        android:background="@android:drawable/editbox_background_normal"
                        android:padding="5dp" />
                </TableRow>

                <TableRow
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">


                    <EditText
                        android:layout_height="wrap_content"
                        android:inputType="textPersonName"
                        android:ems="10"
                        android:id="@+id/etTitulo"
                        android:hint="Título"
                        android:layout_marginLeft="30dp"
                        android:layout_width="match_parent"
                        android:textColor="#000"
                        android:background="@android:drawable/editbox_background_normal"
                        android:padding="5dp" />
                </TableRow>


                    android:layout_width="match_parent"
                    android:layout_height="match_parent" >
                    <ListView
                        android:layout_width="match_parent"
                        android:layout_height="502dp"
                        android:layout_gravity="start"
                        android:choiceMode="multipleChoice"
                        android:dividerHeight="1dp"
                        android:id="@+id/lvAnalisis" />

            </TableLayout>
        </LinearLayout>
    </ScrollView>
</RelativeLayout>

layout del adapter


<TextView
    android:text="Pregunta"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tvPregunta"
    android:textColor="#fff"
    android:layout_marginTop="15dp"
    android:layout_marginBottom="15dp"
    android:layout_marginLeft="2dp" />

<EditText
    android:layout_height="wrap_content"
    android:inputType="textPersonName"
    android:ems="10"
    android:id="@+id/etRespuesta"
    android:layout_width="match_parent"
    android:textColor="#000"
    android:background="@android:drawable/editbox_background_normal"
    android:padding="5dp" />

Finalmente adjunto el error detallado

            E/AsyncHttpRH: User-space exception detected!
           java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
               at android.view.LayoutInflater.from(LayoutInflater.java:232)
               at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:181)
               at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:166)
               at grupooesia.com.oesiacaseapp.ItemListAdapter.<init>(ItemListAdapter.java:0)
               at grupooesia.com.oesiacaseapp.Analisis$1.onSuccess(Analisis.java:127)
               at com.loopj.android.http.TextHttpResponseHandler.onSuccess(TextHttpResponseHandler.java:118)
               at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:351)
               at com.loopj.android.http.AsyncHttpResponseHandler$ResponderHandler.handleMessage(AsyncHttpResponseHandler.java:510)
               at android.os.Handler.dispatchMessage(Handler.java:102)
               at android.os.Looper.loop(Looper.java:154)
               at android.app.ActivityThread.main(ActivityThread.java:6119)
               at java.lang.reflect.Method.invoke(Native Method)
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

— modificado el 14-nov-2016 13:34:34

  • Posts del Foro: 1.974

14-nov-2016 12:55:44 vía Web

El siguiente error "java.lang.NullPointerException", viene cuando has declarado un objeto, y a la hora de llamarlo no está inicializado, osea el "new"... es lo que te debe faltar o haberle dado un valor.

No seas egoísta y comparte tus conocimientos Android.
:D

  • Posts del Foro: 5

14-nov-2016 13:32:23 vía Web

Si, eso ya lo he hecho he quitado lo que habia en el if y he iniciado la view y ya no me da ese problema ahora me dice el mismo error pero con el context

Ahora lo tengo asi
@Override
public View getView(int posicion, View convertView, ViewGroup parent) {
cabecera = new Cabecera();
View view = convertView;
if (view == null) {
LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = li.inflate(R.layout.list_item, parent, false);
}
cabecera.setTvPregunta((TextView) view.findViewById(R.id.tvPregunta));
view.setTag(cabecera);
items = new Item();
cabecera.getTvPregunta().setText(items.getPregunta());
//cabecera.getEtRespuesta().setText(item);*/
return view;
}

y este es el error

E/AsyncHttpRH: User-space exception detected!
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
at android.view.LayoutInflater.from(LayoutInflater.java:232)
at android.widget.ArrayAdapter.(ArrayAdapter.java:181)
at android.widget.ArrayAdapter.(ArrayAdapter.java:166)
at grupooesia.com.oesiacaseapp.ItemListAdapter.(ItemListAdapter.java:0)
at grupooesia.com.oesiacaseapp.Analisis$1.onSuccess(Analisis.java:127)
at com.loopj.android.http.TextHttpResponseHandler.onSuccess(TextHttpResponseHandler.java:118)
at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:351)
at com.loopj.android.http.AsyncHttpResponseHandler$ResponderHandler.handleMessage(AsyncHttpResponseHandler.java:510)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

  • Posts del Foro: 1.974

14-nov-2016 14:29:45 vía Web

Context es una clase abstracta y no se puede instanciar directamente. Se tiene que llamar a una clase "hija" que herede por ejemplo de Context. Debe de ir por ahí la cosa.

No seas egoísta y comparte tus conocimientos Android.
:D

  • Posts del Foro: 5

14-nov-2016 14:32:09 vía Web

Diego

Context es una clase abstracta y no se puede instanciar directamente. Se tiene que llamar a una clase "hija" que herede por ejemplo de Context. Debe de ir por ahí la cosa.

Como declaro la clase Context es que con esa no he trabajado mucho

  • Posts del Foro: 1.974

14-nov-2016 14:39:21 vía Web

Context es al propio concepto al que nos referimos. Si nos referimos a la propia aplicación:
Context context = getApplicationContext;
o this;
o MainActivity.this;

No seas egoísta y comparte tus conocimientos Android.
:D

  • Posts del Foro: 5

14-nov-2016 14:45:02 vía Web

Diego

Context es al propio concepto al que nos referimos. Si nos referimos a la propia aplicación:
Context context = getApplicationContext;
o this;
o MainActivity.this;

y en el caso de que no me dejase declarar el getApplicactionContext o el this?

  • Posts del Foro: 5

16-nov-2016 15:58:59 vía Web

Diego

Prueba con getcontext.
Te recomiendo este artículo que ya me lo he leído unas cuantas veces y seguro que te aporta algo de luz. Espero que puedas solucionarlo (cool)

La verdad es que me ha aclarado las cosas con el context pero sigo sin saber por que no funciona

  • Posts del Foro: 1.974

16-nov-2016 23:39:00 vía Web

Te dejo un enlace de mi Github aplicación mis_apuntes, directamente con las 4 Clases, con los que trabajo sobre una listview y base de datos. Lo mismo te aclara algo.

No seas egoísta y comparte tus conocimientos Android.
:D