entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

ListView con Imagenes de Internet, ayuda!

Hola,

Soy nuevo en el foro y posiblemente ya este esta pregunta, pero de todas formas la hago.

Estoy empezando esto de programar y necesito hacer un listview con imagenes (la Url) que vienen desde una base de datos MySQL, he buscado en internet por dias, pero hay demaciadas formas diferentes y me termine confundiendo.

Lo que pido es que alguien que le funcione me deje una forma basica de como poner una imagen de internet junto con un texto en un listview, lo mas basico para yo saber como funciona el proceso y de ahi ir agregando mis propias funciones...

Como dije pido ayuda ya que en internet hay muchas formas y me termino confundiendo, recuerden que soy nuevo y por eso pido su ayuda... el codigo de abajo es el que estoy utilizando para hacer la pruebas, con este codigo me sirve para traer el mero texto, me falta es la parte para convertir el url en la imagen , descargarla o lo que sea que se tenga que hacer.


public class MainActivity extends ActionBarActivity {

    String myJSON;

    private static final String TAG_RESULTS="result";
    private static final String TAG_nombre = "nombre";
    private static final String TAG_fecha = "fecha";
    private static final String TAG_fotoe ="foto_empresa";
    private static final String TAG_fotod ="foto_dueño";

    JSONArray eventos = null;

    ArrayList<HashMap<String, String>> eventoslist;

    ListView list;

    int IMAGENES[] = new int[2];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        list = (ListView) findViewById(R.id.listView);
        eventoslist = new ArrayList<HashMap<String,String>>();
        getData();

    }

    public void getData() {
        class GetDataJSON extends AsyncTask<String, Void, String>{

            @Override
            protected String doInBackground(String... params) {
                DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
                HttpPost httppost = new HttpPost("http://pippaenlinea.com.co/php/verificar.php?x=2");

                // Depends on your web service
                httppost.setHeader("Content-type", "application/json");

                InputStream inputStream = null;
                String result = null;
                try {
                    HttpResponse response = httpclient.execute(httppost);
                    HttpEntity entity = response.getEntity();

                    inputStream = entity.getContent();
                    // json is UTF-8 by default
                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
                    StringBuilder sb = new StringBuilder();

                    String line = null;
                    while ((line = reader.readLine()) != null)
                    {
                        sb.append(line + "\n");
                    }
                    result = sb.toString();
                } catch (Exception e) {
                    // Oops
                }
                finally {
                    try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
                }
                return result;
            }

            @Override
            protected void onPostExecute(String result){
                myJSON=result;
                showList();
            }
        }
        GetDataJSON g = new GetDataJSON();
        g.execute();
    }

    protected void showList(){
        try {
            JSONObject jsonObj = new JSONObject(myJSON);
            eventos = jsonObj.getJSONArray(TAG_RESULTS);

            for(int i=0;i<eventos.length();i++){
                JSONObject c = eventos.getJSONObject(i);
                String nombre = c.getString(TAG_nombre);
                String fecha = c.getString(TAG_fecha);
                String fotoe = c.getString(TAG_fotoe);
                String fotod = c.getString(TAG_fotod);

                HashMap<String,String> events = new HashMap<String,String>();

                events.put(TAG_nombre,nombre);
                events.put(TAG_fecha,fecha);
                events.put(TAG_fotoe,fotoe);
                events.put(TAG_fotod,fotod);

                eventoslist.add(events);
            }

            ListAdapter adapter = new SimpleAdapter(
                    MainActivity.this, eventoslist, R.layout.list_item,
                    new String[]{TAG_fotoe,TAG_nombre,TAG_fecha},
                    new int[]{R.id.iv_empresa,R.id.tv_name, R.id.tv_fecha}
            );

            list.setAdapter(adapter);

        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

}

1 Respuesta

1voto

x4mp73r Puntos13390

Antes que nada, cabe aclarar que esto no va a solucionar tu problema directamente, pero espero y te de una idea de como poder solucionarlo o al menos te abra paso para nuevas ideas.
. . . .
Anteriormente igual hice un proyecto casi igual, es decir, manejé peticiones GET y POST, pero ya que los obtenía los guardaba en HashMap y ya estando ahí ya los volvía a obtener con get.(), etc.,digo casi porque las diferencias son muy visibles pero repito que quizá te sirva de algo

En una respuesta que hice ya hace mucho, existen unas líneas de código que permiten mostrar una imagen de internet en un ImageView, es esta:

http://entredesarrolladores.com/11759/mostrar-imagen-con-url-en-android?show=11759#q11759

Bueno, lo ideal es que ese método lo coloques en una clase aparte, de esta manera puedes usarla las veces que quieras, ejemplo:

public class Helpers {

   public static Bitmap get_ImageBitmap(String url) {

        Bitmap bm = null;
        try {
            URL url_add = new URL(url);
            URLConnection conn = url_add.openConnection();
            conn.connect();
            InputStream is = conn.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            bm = BitmapFactory.decodeStream(bis);
            bis.close();
            is.close();

        } catch (IOException e) {

        }
        return bm;
    }
}

Bien, entonces en tu adapter con el cual vas a completar el
ListView le tienes que agregar el imageView en el cual se cargarán las imágenes, tu adapter me imagino que se ha de parecer al siguiente:

public class  ContentsArrayAdapter extends ArrayAdapter<HashMap> {

    private final Context context;
    private TextView contentItemTextTextView; //Texto de la imagen
    private TextView descriptionItem; //Descripción de la imagen
    private ImageView imageItemContent; //Contenedor de la imagen
    private static final String TAG = "ContentsArrayAdapter";
    private ProgressDialog progressDialog; //Un diálogo de espera

    public ContentsArrayAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
        this.context = context;
    }

    @Override
    public void add(HashMap hash) {
        super.add(hash);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        HashMap chatMessageObj = getItem(position);

        LayoutInflater inflater = (LayoutInflater) this.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        //Hacer la descarga de imágenes en otro hilo que no sea el principal
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        //Aquí cargo e inflo un layout que hice por aparte que contiene la estructura de un ítem del ListView, es decir, imagen+texto
        View rowView = inflater.inflate(R.layout.list_item_content, parent, false);

        contentItemTextTextView = (TextView) rowView.findViewById(R.id.titleItem);

        //Aquí es donde le paso el texto del get a mi API
        contentItemTextTextView.setText((String) chatMessageObj.get("name"));
        //Aquí es donde le paso el texto del get a mi API 
       descriptionItem = (TextView) rowView.findViewById(R.id.descriptionItem);
        descriptionItem.setText((String) chatMessageObj.get("description"));

        //Aquí es donde le paso el ID del ImageView 
        imageItemContent = (ImageView) rowView.findViewById(R.id.imageItemContent);
        //Manda la imagen descargada al ImageView
        Bitmap get_image = Helpers.get_ImageBitmap((String) chatMessageObj.get("image_url"));
        imageItemContent.setImageBitmap(get_image);

//Aquí hago uso de la clase de arriba y le paso el parámetro String, pero en este caso le paso lo que obtenga del GET y al final se lo mando al ImageView

        return rowView;
    }

}

Este adapter es solo para ejemplificar que algo así has de tener y no hagas caso a los Hashmaps, solo a la parte donde se le pasa la url al ImageView .

La verdad, es muy diferente, pero te dejé comentado las líneas mas importantes, la idea que te haya compartido esto es para que te des una idea como resolverlo, como te dije, creas una clase con el método para bajar las imágenes y le pasas como parámetro la URL, esta última se la mandas por medio de tus peticiones. Una disculpa si no te ayuda o si no me expliqué bien, es que ya dejé a un lado el desarrollo y solo me quedan trozos de códigos, solo quise aportar mi granito de arena

0voto

CeduardoLS comentado

Hola,

Los del bitmap (el helpers) y el setImageBitmap lo intiendo pero como te digo no se como como implementarlo en el adapter del listview.. pero me dio ma omenos la idea entonces voy a seguir intentando.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta