android - debugger - open graph whatsapp
Imágenes de caché y visualización (5)
¿Quieres algo fácil de usar? ¿Cuidar de almacenar en caché los archivos, eliminar el caché, liberar cuando la memoria está en la línea de borde?
Prueba LazyList, échale un vistazo:
https://github.com/nicolasjafelle/LazyList
Como se explica, solo necesita crear el Singleton en su clase de aplicación o en cualquier otra actividad o fragmento:
//To use the default external folder, this folder will be deleted when the app no longe exists.
ImageLoader.getInstance().init(getApplicationContext());
//Or to use another folder, use...
//ImageLoader.getInstance().init(getApplicationContext(), "MyExternalFolder");
Luego, en su vista que tiene el ImageView para mostrar la imagen, necesita implementar la interfaz ImageProcessingCallback:
public class MyItemView extends LinearLayout implements ImageProcessingCallback {
...
//Do what you need in methods onImagePreProcessing() and onImageProcessing(Bitmap bitmap)
...
ImageLoader.getInstance().displayImage(data[position], myView);
Finalmente necesita agregar este permiso en su androidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Y eso es. Luego tiene métodos para borrar la memoria caché para la memoria caché RAM o la memoria caché de disco o ambos.
Hola, estoy enfrentando un problema particular en el que necesito descargar imágenes y mostrarlas en un ListView
correspondiente a su TextView''s
particular. El código que tengo está mostrando con éxito el TextView''s
que necesito mostrar, pero no sé cómo mostrar todas estas diferentes imágenes junto a mis vistas de texto en mi ListView
.
Después de pasar por muchos hilos en SO. Las respuestas principales son resolver esto con 1. Lazy List 2. Universal Image Loader
He pasado por ambas soluciones. Descargué códigos de Lazy List en los que las URL son cadenas codificadas en un Array. Lo que me gustaría hacer es crear mis propias cadenas dinámicamente. Almacénelos en caché y visualice todas las imágenes correspondientes.
Aquí está mi código:
public class Tools_ListItemActivity extends ListActivity
{
private Context context;
String s;
private static final String TAG_POSTS = "posts";
private static final String TAG_MDNAME = "mdname";
private static final String TAG_UTCOST = "utcost";
private static final String TAG_IIMG= "iimg";
JSONArray posts = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
s=getIntent().getExtras().getString("url");
new ProgressTask(Tools_ListItemActivity.this).execute();
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
}
ArrayList<HashMap<String, String>> jsonlist = new ArrayList<HashMap<String, String>>();
ListView lv ;
private class ProgressTask extends AsyncTask<String, Void, Boolean> {
private ProgressDialog dialog;
public ProgressTask(ListActivity activity) {
Log.i("1", "Called");
context = activity;
dialog = new ProgressDialog(context);
}
/** progress dialog to show user that the backup is processing. */
/** application context. */
private Context context;
protected void onPreExecute() {
this.dialog.setMessage("Progress start");
this.dialog.show();
}
@Override
protected void onPostExecute(final Boolean success) {
if (dialog.isShowing()) {
dialog.dismiss();
}
ListAdapter adapter = new SimpleAdapter(context, jsonlist,
R.layout.activity_toolsitem, new String[] { TAG_IIMG, TAG_MDNAME, TAG_UTCOST }, new int[] {
R.id.imageViewUrl, R.id.mdname, R.id.utcost });
setListAdapter(adapter);
// selecting single ListView item
lv = getListView();
}
protected Boolean doInBackground(final String... args) {
JSONParser jParser = new JSONParser();
// getting JSON string from URL
JSONObject json = jParser.getJSONFromUrl(s);
try {
posts = json.getJSONArray(TAG_POSTS);
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try
{
// looping through All Contacts
for(int i = 0; i < posts.length(); i++){
JSONObject c = posts.getJSONObject(i);
// Storing each json item in variable
String mdname = c.getString(TAG_MDNAME);
String utcost= c.getString(TAG_UTCOST);
String iimg=c.getString(TAG_IIMG);
//Forming the Url of the image to be shown in the list view
String imageUrl="My_App_URL"+iimg;
/* try {
String imageUrl="My_App_URL"+iimg;
ImageView imageView = (ImageView)findViewById(R.id.imageViewUrl);
Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageUrl).getContent());
imageView.setImageBitmap(bitmap);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} */
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(TAG_MDNAME, mdname);
map.put(TAG_UTCOST, utcost);
map.put(TAG_IIMG, iimg);
jsonlist.add(map);
} }catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
}
Aquí he depurado y descubrí que imageUrl
se ha formado correctamente. Json
solo devuelve el nombre del jpg
así que lo imageUrl
a la URL y lo imageUrl
en imageUrl
. Las otras dos vistas de texto se analizan y muestran correctamente. Si alguien me puede ayudar a mostrar las imágenes en la vista de la imagen, entonces sería genial. Gracias.
Actualización: pude resolver mi problema particular con la ayuda del enlace compartido por Pankaj ( https://github.com/AndroidBegin/Android-JSON-Parse-Images-and-Texts-Tutorial ) y el concepto de conocimiento compartido por Raghunandan abajo. Lea estas respuestas para obtener una explicación detallada, así como la implementación de la carga diferida. Mis disculpas por no poder recompensar una respuesta con recompensa ya que estuve fuera dos días.
Aquí se explica cómo cargar y almacenar en caché las imágenes en un ListView
que crea una lista de contactos para el usuario. Así que imagínese la imagen de perfil a la izquierda, algunas vistas de texto a la derecha (que suenan cerca del problema con el que está tratando. Ignore las etiquetas de depuración feas y probablemente el formato deficiente (lo siento). Supongo que esto es algo así como LazyList, pero aquí está Una explicación detallada en caso de que alguien estuviera confundido.
Paso 1: Configura tu caché
private LruCache<String, Bitmap> memoryCache;
private HashMap<String, String> idPairs = new HashMap<String, String>();
En mi enfoque, uso un LruCache
y un HashMap
para rastrear las imágenes de los usuarios que he descargado. Verás cómo se implementa más adelante, pero la idea es evitar descargar cosas del servidor a menos que tengas que hacerlo. Luego, en su onCreate()
o algún método relacionado, inicialice su caché.
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
memoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap){
return (bitmap.getRowBytes() * bitmap.getHeight()) / 1024; //don''t use getByteCount for API < 12
}
};
Mi siguiente paso es agregar el mapa de bits predeterminado de "imagen vacía" al caché en caso de que llegue a una entrada que no tenga una imagen asociada. De esa manera solo tengo que procesar y agregar este bitmap una vez.
Bitmap defaultPicture = BitmapFactory.decodeResource(getResources(), R.drawable.default_user_picture);
addBitmapToMemoryCache("default", defaultPicture);
¡Entonces es hora de obtener los datos que necesita para la lista!
Paso 2: Obtener los datos
private class GetPeopleData extends AsyncTask<JSONArray, Void, Void> {
@Override
protected Void doInBackground(JSONArray...lists) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost();
ResponseHandler <String> responseHandler = new BasicResponseHandler();
if(DEBUG) Log.d("GET PEOPLE DATA TASK", lists[0].length() + " users");
getUsers(lists[0], httpClient, httpPost, responseHandler);
return null;
}
@Override
protected void onPostExecute(Void result){
updateUserListView();
}
}
Aquí hay una AsyncTask de AsyncTask
que toma un JSONArray
de datos de usuario como un argumento. Dejé de lado esa parte porque es prácticamente una descarga HTTP básica que no necesita explicación. El método getUsers es donde comienzo a reunir lo que se agregará a mi ListView
. Lo que hago a continuación es procesar el JSON descargado del servidor para crear objetos de usuario que se agregarán a una lista de usuarios que se mostrarán.
private void getUsers(JSONArray userArray, HttpClient httpClient, HttpPost httpPost, ResponseHandler<String> responseHandler){
if(DEBUG) Log.d("USERS ARRAY", userArray.length() + " users");
try{
users = new ArrayList<User>();
if(DEBUG) Log.d("User Array -START", "" + users.size());
//Go through userArray and get information needed for list
for(int i = 0; i < userArray.length(); i++){
User u = new User();
if(DEBUG) Log.d("User Array - ADD USER", "" + users.size());
String profileId = userArray.getJSONObject(i).getString("profileid");
u.setId(userArray.getJSONObject(i).getString("id"));
u.setDisplayName(userArray.getJSONObject(i).getString("displayname"));
u.setStatus(userArray.getJSONObject(i).getString("status"));
//check HashMap for sender/profileid pair
if(idPairs.containsKey(profileId)){
if(DEBUG) Log.d("idPairs", "User in HashMap");
profileId = idPairs.get(profileId);
} else {
if(DEBUG) Log.d("idPairs", "User not in HashMap. Add profileId");
idPairs.put("profileId", profileId);
}
u.setProfilePicture(getProfilePictureFromCache(profileId, httpClient, httpPost, responseHandler)); //check cache for image
users.add(u);
if(DEBUG) Log.d("User info", u.toString());
}
} catch (Exception e) {
Log.e("BACKGROUND_PROC", e.getMessage());
}
}
Asocio la imagen con el objeto de usuario que eventualmente se mostrará. Me imagino que esto no es una pérdida total de tiempo ya que la imagen se extrae de la caché de mapa de bits
private Bitmap getProfilePictureFromCache(String profileId, HttpClient httpClient, HttpPost httpPost, ResponseHandler<String> responseHandler){
Bitmap defaultPicture = getBitmapFromMemCache("default");
Bitmap profilePicture = getBitmapFromMemCache(profileId);
if(profilePicture != null){
return profilePicture;
} else {
String pictureString = getProfilePic(profileId, httpClient, httpPost, responseHandler);
if(!pictureString.isEmpty()){
byte[] decodedString = Base64.decode(pictureString, Base64.DEFAULT);
profilePicture = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
addBitmapToMemoryCache(profileId, profilePicture);
if(DEBUG) Log.d("MEMCACHE", "Download and store picture for " + profileId);
return profilePicture;
} else if (defaultPicture != null && pictureString.equals(null)) {
if(DEBUG) Log.d("MEMCACHE", "Load default picture");
return defaultPicture;
}
}
return defaultPicture;
}
Si existe una imagen en el caché, se devuelve, si no se descarga. Para mí, mostrando a los usuarios, cada imagen se almacena en caché según el ID de usuario, por lo que incluso si alguien apareciera más de una vez en la lista, solo habría una imagen almacenada en la caché para ese usuario.
ImageView profile_picture = (ImageView) v.findViewById(R.id.profile_picture);
if(profile_picture != null){
profile_picture.setImageBitmap(u.getProfilePicture());
}
Lo único que queda por hacer es encontrar el ImageView
en su adaptador y establecer esa vista a la imagen que asoció con el objeto en su lista.
Carga perezosa utilizando Universal Imageloader. Reemplace las urls codificadas por url de imágenes.
Modifique el siguiente de acuerdo a sus requerimientos
¿Qué es LazyList? . Revisa este enlace para más detalles.
MainActivity.java
public class MainActivity extends Activity {
private String[] mStrings={
"http://a3.twimg.com/profile_images/670625317/aam-logo-v3-twitter.png",
"http://a3.twimg.com/profile_images/740897825/AndroidCast-350_normal.png",
"http://a3.twimg.com/profile_images/121630227/Droid_normal.jpg",
"http://a1.twimg.com/profile_images/957149154/twitterhalf_normal.jpg",
"http://a1.twimg.com/profile_images/97470808/icon_normal.png",
"http://a3.twimg.com/profile_images/511790713/AG.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/72774055/AndroidHomme-LOGO_normal.jpg",
"http://a1.twimg.com/profile_images/349012784/android_logo_small_normal.jpg",
"http://a1.twimg.com/profile_images/841338368/ea-twitter-icon.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a1.twimg.com/profile_images/850960042/elandroidelibre-logo_300x300_normal.jpg",
"http://a1.twimg.com/profile_images/655119538/andbook.png",
"http://a3.twimg.com/profile_images/768060227/ap4u_normal.jpg",
"http://a1.twimg.com/profile_images/74724754/android_logo_normal.png",
"http://a3.twimg.com/profile_images/681537837/SmallAvatarx150_normal.png",
"http://a1.twimg.com/profile_images/63737974/2008-11-06_1637_normal.png",
"http://a3.twimg.com/profile_images/548410609/icon_8_73.png",
"http://a1.twimg.com/profile_images/612232882/nexusoneavatar_normal.jpg",
"http://a1.twimg.com/profile_images/213722080/Bugdroid-phone_normal.png",
"http://a1.twimg.com/profile_images/645523828/OT_icon_090918_android_normal.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a1.twimg.com/profile_images/850960042/elandroidelibre-logo_300x300_normal.jpg",
"http://a1.twimg.com/profile_images/655119538/andbook_normal.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/72774055/AndroidHomme-LOGO_normal.jpg",
"http://a1.twimg.com/profile_images/349012784/android_logo_small_normal.jpg",
"http://a1.twimg.com/profile_images/841338368/ea-twitter-icon_normal.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a1.twimg.com/profile_images/850960042/elandroidelibre-logo_300x300.jpg",
"http://a1.twimg.com/profile_images/655119538/andbook_normal.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/121630227/Droid.jpg",
"http://a1.twimg.com/profile_images/957149154/twitterhalf_normal.jpg",
"http://a1.twimg.com/profile_images/97470808/icon_normal.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man.png",
"http://a3.twimg.com/profile_images/72774055/AndroidHomme-LOGO_normal.jpg",
"http://a1.twimg.com/profile_images/349012784/android_logo_small_normal.jpg",
"http://a1.twimg.com/profile_images/841338368/ea-twitter-icon_normal.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet.png",
"http://a3.twimg.com/profile_images/670625317/aam-logo-v3-twitter_normal.png",
"http://a3.twimg.com/profile_images/740897825/AndroidCast-350_normal.png",
"http://a3.twimg.com/profile_images/121630227/Droid_normal.jpg",
"http://a1.twimg.com/profile_images/957149154/twitterhalf_normal.jpg",
"http://a1.twimg.com/profile_images/97470808/icon.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/72774055/AndroidHomme-LOGO_normal.jpg",
"http://a1.twimg.com/profile_images/349012784/android_logo_small_normal.jpg",
"http://a1.twimg.com/profile_images/841338368/ea-twitter-icon.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a1.twimg.com/profile_images/850960042/elandroidelibre-logo_300x300_normal.jpg",
"http://a1.twimg.com/profile_images/655119538/andbook_normal.png",
"http://a3.twimg.com/profile_images/768060227/ap4u_normal.jpg",
"http://a1.twimg.com/profile_images/74724754/android_logo.png",
"http://a3.twimg.com/profile_images/681537837/SmallAvatarx150_normal.png",
"http://a1.twimg.com/profile_images/63737974/2008-11-06_1637_normal.png",
"http://a3.twimg.com/profile_images/548410609/icon_8_73_normal.png",
"http://a1.twimg.com/profile_images/612232882/nexusoneavatar_normal.jpg",
"http://a1.twimg.com/profile_images/213722080/Bugdroid-phone_normal.png",
"http://a1.twimg.com/profile_images/645523828/OT_icon_090918_android.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a1.twimg.com/profile_images/850960042/elandroidelibre-logo_300x300_normal.jpg",
"http://a1.twimg.com/profile_images/655119538/andbook.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/72774055/AndroidHomme-LOGO_normal.jpg",
"http://a1.twimg.com/profile_images/349012784/android_logo_small_normal.jpg",
"http://a1.twimg.com/profile_images/841338368/ea-twitter-icon.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto.jpg",
"http://a1.twimg.com/profile_images/850960042/elandroidelibre-logo_300x300_normal.jpg",
"http://a1.twimg.com/profile_images/655119538/andbook_normal.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/121630227/Droid_normal.jpg",
"http://a1.twimg.com/profile_images/957149154/twitterhalf.jpg",
"http://a1.twimg.com/profile_images/97470808/icon_normal.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/72774055/AndroidHomme-LOGO_normal.jpg",
"http://a1.twimg.com/profile_images/349012784/android_logo_small.jpg",
"http://a1.twimg.com/profile_images/841338368/ea-twitter-icon_normal.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png"
};
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv= (ListView) findViewById(R.id.lv);
lv.setAdapter(new LazyAdapter(this,mStrings));
}
}
activity_main.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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#000000"
android:focusableInTouchMode="false"
android:listSelector="@android:color/transparent"
android:layout_weight="2.0"
android:divider="#000000"
android:headerDividersEnabled="false"
android:footerDividersEnabled="false"
android:dividerHeight="8dp"
android:drawSelectorOnTop="false"
/>
</RelativeLayout>
LazyAdapter.java
public class LazyAdapter extends BaseAdapter {
private Activity activity;
private String data[];
private LayoutInflater inflater=null;
public ImageLoader imageLoader;
DisplayImageOptions options;
public LazyAdapter(Activity a, String[] d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
File cacheDir = StorageUtils.getOwnCacheDirectory(a, "MyFolderCache");
// Get singletone instance of ImageLoader
imageLoader = ImageLoader.getInstance();
// Create configuration for ImageLoader (all options are optional)
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a)
// You can pass your own memory cache implementation
.discCacheExtraOptions(1024, 1024, CompressFormat.PNG, 100)
.discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
.discCacheFileNameGenerator(new HashCodeFileNameGenerator())
.enableLogging()
.build();
// Initialize ImageLoader with created configuration. Do it once.
imageLoader.init(config);
//imageLoader.init(ImageLoaderConfiguration.createDefault(a));
// imageLoader=new ImageLoader(activity.getApplicationContext());
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_launcher)
.cacheInMemory()
.cacheOnDisc()
.displayer(new RoundedBitmapDisplayer(20))
.build();
}
public int getCount() {
return data.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
ViewHolder vh = new ViewHolder();;
if(convertView==null)
{
vi = inflater.inflate(R.layout.row, null);
vh.iv=(ImageView)vi.findViewById(R.id.ivv);
vh.pb= (ProgressBar)vi.findViewById(R.id.pb);
vh.tv = (TextView) vi.findViewById(R.id.textView1);
vh.tv1= (TextView) vi.findViewById(R.id.textView2);
}
vh.tv.setText("Image in postion =");
vh.tv1.setText(""+position);
display(vh.iv, data[position], vh.pb);
//imageLoader.displayImage(data.get(position).toString(), image,options);
return vi;
}
public void display(ImageView img, String url, final ProgressBar spinner)
{
imageLoader.displayImage(url, img, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
spinner.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
spinner.setVisibility(View.GONE);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
spinner.setVisibility(View.GONE);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
}
public static class ViewHolder
{
ImageView iv;
TextView tv,tv1;
ProgressBar pb;
}
}
row.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/ic_launcher" />
<ProgressBar
android:id="@+id/pb"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/textView2"
android:layout_alignParentLeft="true"
android:layout_marginBottom="21dp"
android:layout_marginLeft="31dp"
android:text="TextView" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_alignParentBottom="true"
android:text="TextView" />
</RelativeLayout>
Añadir permiso en manifiesto
<uses-permission android:name="android.permission.INTERNET"/>
No sé cómo almacenar las imágenes, ya que mi aplicación utiliza imágenes de la APK. Sin embargo, creo que para mostrar esas imágenes desea un Arrayadapter personalizado.
Esto infla un diseño para cada elemento y lo coloca en una lista. Este diseño está definido por un diseño XML que crea y especifica en su construcción. Debería intentar extender el adaptador que utilice actualmente para su vista de lista con uno personalizado que configure la vista de imagen según el elemento.
Hago esto con ImageView.setImageResource (ID de recurso); Pero tu kilometraje puede variar. Tengo mis imágenes en el APK no estoy seguro de cómo mostrarlas desde una fuente externa
Por favor intente esto con el cargador de imágenes universal
public class DetailsListViewAdapter extends ArrayAdapter<Entry>{
private Context context;
private List<Entry> detailList;
DisplayImageOptions options;
public ImageLoader imageLoader;
public DetailsListViewAdapter(Context context, int textViewResourceId,List<Entry> detailList) {
super(context, textViewResourceId,detailList);
this.detailList = detailList;
this.context = context;
imageLoader = ImageLoader.getInstance();
imageLoader.init(ImageLoaderConfiguration.createDefault(context));
options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.blankimage)
.showImageOnFail(R.drawable.blankimage)
.resetViewBeforeLoading()
.cacheOnDisc()
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.bitmapConfig(Bitmap.Config.RGB_565)
.displayer(new FadeInBitmapDisplayer(300))
.build();
}
static class ViewHolder{
private TextView popupDetails;
private TextView pubDate;
private ImageView image;
private ProgressBar progress;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder holder;
if (v == null) {
LayoutInflater vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.details_list_item, null);
holder = new ViewHolder();
holder.popupDetails=(TextView)v.findViewById(R.id.detailHeading);
holder.pubDate = (TextView)v.findViewById(R.id.pubDate);
holder.image = (ImageView)v.findViewById(R.id.listImg);
holder.progress = (ProgressBar)v.findViewById(R.id.progressBar);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
Entry value = detailList.get(position);
holder.popupDetails.setText(value.getTitle());
holder.pubDate.setText(value.getPubDate());
String url = value.getImageLink();
try {
if(url.length() > 5) {
holder.image.setVisibility(View.VISIBLE);
loadImage(holder.image,url,holder.progress);
} else {
if(url.equals("NO")) {
holder.image.setVisibility(View.INVISIBLE);
} else {
holder.image.setVisibility(View.GONE);
}
}
} catch (Exception e) {
Logger.show(e);
}
v.setBackgroundColor(Color.WHITE);
return v;
}
public void loadImage(ImageView imageView, String loadURL,final ProgressBar progress) {
imageLoader.displayImage(loadURL, imageView, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
progress.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
String message = null;
switch (failReason) {
case IO_ERROR:
message = "Input/Output error";
break;
case OUT_OF_MEMORY:
message = "Out Of Memory error";
break;
case NETWORK_DENIED:
message = "Downloads are denied";
break;
case UNSUPPORTED_URI_SCHEME:
message = "Unsupported URI scheme";
break;
case UNKNOWN:
message = "Unknown error";
break;
}
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
@Override
public void onLoadingComplete(final String imageUri, View view, final Bitmap loadedImage) {
progress.setVisibility(View.INVISIBLE);
}
});
}
}