with tipos studio programacion example desplegable adaptadores android listview android-image

tipos - ¿Cómo mostrar una lista de imágenes en un ListView en Android?



manual de programacion android pdf (8)

Aquí está la simple Lista de vistas con diferentes imágenes. En primer lugar, debe copiar los diferentes tipos de imágenes y pegarlas en res / drawable-hdpi en su proyecto. Las imágenes deben tener formato .png. luego copia este código

En main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textview" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>

crea listview_layout.xml y pega este código

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:id="@+id/flag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/hello" android:paddingTop="10dp" android:paddingRight="10dp" android:paddingBottom="10dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/txt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="15dp" android:text="TextView1" /> <TextView android:id="@+id/cur" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="10dp" android:text="TextView2" /> </LinearLayout> </LinearLayout>

En tu actividad

package com.test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; import android.widget.SimpleAdapter; public class SimpleListImageActivity extends Activity { // Array of strings storing country names String[] countries = new String[] { "India", "Pakistan", "Sri Lanka", "China", "Bangladesh", "Nepal", "Afghanistan", "North Korea", "South Korea", "Japan" }; // Array of integers points to images stored in /res/drawable-hdpi/ int[] flags = new int[]{ R.drawable.image1, //here you have to give image name which you already pasted it in /res/drawable-hdpi/ R.drawable.image2, R.drawable.image3, R.drawable.image4, R.drawable.image5, R.drawable.image6, R.drawable.image7, R.drawable.image8, R.drawable.image9, R.drawable.image10, }; // Array of strings to store currencies String[] currency = new String[]{ "Indian Rupee", "Pakistani Rupee", "Sri Lankan Rupee", "Renminbi", "Bangladeshi Taka", "Nepalese Rupee", "Afghani", "North Korean Won", "South Korean Won", "Japanese Yen" }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Each row in the list stores country name, currency and flag List<HashMap<String,String>> aList = new ArrayList<HashMap<String,String>>(); for(int i=0;i<10;i++){ HashMap<String, String> hm = new HashMap<String,String>(); hm.put("txt", "Country : " + countries[i]); hm.put("cur","Currency : " + currency[i]); hm.put("flag", Integer.toString(flags[i]) ); aList.add(hm); } // Keys used in Hashmap String[] from = { "flag","txt","cur" }; // Ids of views in listview_layout int[] to = { R.id.flag,R.id.txt,R.id.cur}; // Instantiating an adapter to store each items // R.layout.listview_layout defines the layout of each item SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), aList, R.layout.listview_layout, from, to); // Getting a reference to listview of main.xml layout file ListView listView = ( ListView ) findViewById(R.id.listview); // Setting the adapter to the listView listView.setAdapter(adapter); } }

Este es el código completo. Puedes hacer cambios a tu necesidad ... Los comentarios son bienvenidos

¿Cómo se muestra una lista de imágenes con ListView? Estoy descargando las imágenes en tiempo de ejecución. El número total de imágenes no es fijo.


Comenzaría con algo como esto (y si hay algún problema con mi código, por supuesto apreciaría cualquier comentario):

public class ItemsList extends ListActivity { private ItemsAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.items_list); this.adapter = new ItemsAdapter(this, R.layout.items_list_item, ItemManager.getLoadedItems()); setListAdapter(this.adapter); } private class ItemsAdapter extends ArrayAdapter<Item> { private Item[] items; public ItemsAdapter(Context context, int textViewResourceId, Item[] items) { super(context, textViewResourceId, items); this.items = items; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.items_list_item, null); } Item it = items[position]; if (it != null) { ImageView iv = (ImageView) v.findViewById(R.id.list_item_image); if (iv != null) { iv.setImageDrawable(it.getImage()); } } return v; } } @Override protected void onListItemClick(ListView l, View v, int position, long id) { this.adapter.getItem(position).click(this.getApplicationContext()); } }

Por ejemplo, extender ArrayAdapter con su propio tipo de Elementos (que contiene información sobre sus imágenes) y el método getView() modificado, que prepara la vista para los elementos dentro de la lista. También hay método add() en ArrayAdapter para agregar elementos al final de la lista.

R.layout.items_list es un diseño simple con ListView

R.layout.items_list_item es el diseño que representa un elemento en la lista


El nombre de archivo debe coincidir con el id de diseño que en este ejemplo es: items_list_item.xml en la carpeta de diseño de su aplicación

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/R.id.list_item_image" android:layout_width="100dip" android:layout_height="wrap_content" /> </LinearLayout>


Necesitamos implementar dos diseños. Uno para mantener la vista de lista y otro para mantener el elemento de la fila de la vista de lista. Implemente su propio adaptador personalizado. Idea es incluir una vista de texto y una vista de imagen.

public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View single_row = inflater.inflate(R.layout.list_row, null, true); TextView textView = (TextView) single_row.findViewById(R.id.textView); ImageView imageView = (ImageView) single_row.findViewById(R.id.imageView); textView.setText(color_names[position]); imageView.setImageResource(image_id[position]); return single_row; }

A continuación, implementamos la funcionalidad en la actividad principal para incluir imágenes y datos de texto dinámicamente durante el tiempo de ejecución. Puede pasar matriz de identificación de imágenes y matriz de texto creada dinámicamente al constructor del adaptador personalizado.

Customlistadapter adapter = new Customlistadapter(this, image_id, text_name);


Para obtener los datos de la base de datos, usaría un SimpleCursorAdapter .

Creo que puede vincular directamente el SimpleCursorAdapter a un ListView ; de lo contrario, puede crear una clase de adaptador personalizada que amplíe SimpleCursorAdapter con un ViewBinder personalizado que anule el valor de setViewValue .

Consulte el tutorial del Notepad para ver cómo usar un SimpleCursorAdapter .


Se me ocurrió una solución que llamo "BatchImageDownloader" que ha funcionado bien. Aquí hay un resumen rápido de cómo se usa:

  • Mantenga un HashMap global (idealmente en su objeto Aplicación) que sirva como un caché de objetos dibujables

  • En el método getView () de su Adaptador de lista, use el dibujo extraíble del caché para rellenar el ImageView en su elemento de lista.

  • Cree una instancia de BatchImageDownloader, pasando su adaptador ListView

  • Llame a addUrl () para cada imagen que se debe buscar / mostrar

  • Cuando termine, llame a execute (). Esto dispara una AsyncTask que recupera todas las imágenes y, a medida que se extrae y agrega cada imagen a la caché, actualiza su ListView (llamando a notifyDataSetChanged ())

El enfoque tiene las siguientes ventajas:

  • Se utiliza un solo hilo de trabajo para buscar todas las imágenes, en lugar de un hilo separado para cada imagen / vista
  • Una vez que se obtiene una imagen, todos los elementos de la lista que la usan se actualizan al instante
  • El código no accede directamente a la Vista de imagen en su Elemento de lista, sino que activa una actualización de la vista de lista llamando a notifyDataSetChanged () en su Adaptador de lista, y la implementación getView () simplemente extrae el dibujable del caché y lo muestra. Esto evita los problemas asociados con los objetos de vista reciclados utilizados en ListViews.

Aquí está el código fuente de BatchImageDownloader:

package com.mobrite.androidutils; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.widget.BaseAdapter; public class BatchImageDownloader extends AsyncTask<Void, Void, Void> { List<String> imgUrls = new ArrayList<String>(); BaseAdapter adapter; HashMap<String, Drawable> imageCache; public BatchImageDownloader(BaseAdapter adapter, HashMap<String, Drawable> imageCache) { this.adapter = adapter; this.imageCache = imageCache; } public void addUrl(String url) { imgUrls.add(url); } @Override protected Void doInBackground(Void... params) { for (String url : imgUrls) { if (!imageCache.containsKey(url)) { Drawable bm = downloadImage(url); if (null != bm) { imageCache.put(url, bm); publishProgress(); } } } return null; } @Override protected void onProgressUpdate(Void... values) { adapter.notifyDataSetChanged(); } @Override protected void onPostExecute(Void result) { adapter.notifyDataSetChanged(); } public Drawable downloadImage(String url) { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet request = new HttpGet(url); try { HttpResponse response = httpClient.execute(request); InputStream stream = response.getEntity().getContent(); Drawable drawable = Drawable.createFromStream(stream, "src"); return drawable; } catch (ClientProtocolException e) { e.printStackTrace(); return null; } catch (IllegalStateException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } } }


Seis años después, esto todavía está en la parte superior para algunas búsquedas. Las cosas han cambiado mucho desde entonces. Ahora, el estándar de facto es más o menos usar Volley y el NetworkImageView que se encarga de los trabajos pesados ​​para usted.

Suponiendo que ya tiene configurados correctamente sus Apaters, Loaders y ListFragments, este tutorial oficial de google explica cómo usar NetworkImageView para cargar las imágenes. Las imágenes se cargan automáticamente en una cadena de fondo y la vista se actualiza en la secuencia de la interfaz de usuario. Incluso es compatible con el almacenamiento en caché.


package studRecords.one; import java.util.List; import java.util.Vector; import android.app.Activity; import android.app.ListActivity; import android.content.Context; import android.content.Intent; import android.net.ParseException; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class studRecords extends ListActivity { static String listName = ""; static String listUsn = ""; static Integer images; private LayoutInflater layoutx; private Vector<RowData> listValue; RowData rd; static final String[] names = new String[] { "Name (Stud1)", "Name (Stud2)", "Name (Stud3)","Name (Stud4)" }; static final String[] usn = new String[] { "1PI08CS016","1PI08CS007","1PI08CS017","1PI08CS047" }; private Integer[] imgid = { R.drawable.stud1,R.drawable.stud2,R.drawable.stud3, R.drawable.stud4 }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mainlist); layoutx = (LayoutInflater) getSystemService( Activity.LAYOUT_INFLATER_SERVICE); listValue = new Vector<RowData>(); for(int i=0;i<names.length;i++) { try { rd = new RowData(names[i],usn[i],i); } catch (ParseException e) { e.printStackTrace(); } listValue.add(rd); } CustomAdapter adapter = new CustomAdapter(this, R.layout.list, R.id.detail, listValue); setListAdapter(adapter); getListView().setTextFilterEnabled(true); } public void onListItemClick(ListView parent, View v, int position,long id) { listName = names[position]; listUsn = usn[position]; images = imgid[position]; Intent myIntent = new Intent(); Intent setClassName = myIntent.setClassName("studRecords.one","studRecords.one.nextList"); startActivity(myIntent); } private class RowData { protected String mNames; protected String mUsn; protected int mId; RowData(String title,String detail,int id){ mId=id; mNames = title; mUsn = detail; } @Override public String toString() { return mNames+" "+mUsn+" "+mId; } } private class CustomAdapter extends ArrayAdapter<RowData> { public CustomAdapter(Context context, int resource, int textViewResourceId, List<RowData> objects) { super(context, resource, textViewResourceId, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; TextView title = null; TextView detail = null; ImageView i11=null; RowData rowData= getItem(position); if(null == convertView) { convertView = layoutx.inflate(R.layout.list, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } holder = (ViewHolder) convertView.getTag(); i11=holder.getImage(); i11.setImageResource(imgid[rowData.mId]); title = holder.gettitle(); title.setText(rowData.mNames); detail = holder.getdetail(); detail.setText(rowData.mUsn); return convertView; } private class ViewHolder { private View mRow; private TextView title = null; private TextView detail = null; private ImageView i11=null; public ViewHolder(View row) { mRow = row; } public TextView gettitle() { if(null == title) { title = (TextView) mRow.findViewById(R.id.title); } return title; } public TextView getdetail() { if(null == detail) { detail = (TextView) mRow.findViewById(R.id.detail); } return detail; } public ImageView getImage() { if(null == i11) { i11 = (ImageView) mRow.findViewById(R.id.img); } return i11; } } } }

//mainlist.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>