缓存图像并显示

你好我正面临着一个特殊的问题,我需要下载图像,并显示在与他们特定的TextView's相对应的ListView TextView's 。 我的代码已经成功显示TextView's我需要显示,但我不知道如何显示我的ListView我的文本视图旁边的所有这些不同的图像。

在经过了许多线程后。 最好的答案是解决这个1.懒惰列表2.通用图像加载器

我已经经历了两个解决方案。 我下载了Lazy List代码,其中的URL是存储在Array中的硬编码字符串。 我想要做的是动态地创建我自己的字符串。 将它们存储到缓存中并显示所有相应的图像。

这是我的代码:

 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; } } } 

在这里,我已经调试,发现imageUrl形成正确。 Json只返回jpg的名字,所以我把它追加到URL并将其存储在imageUrl 。 另外两个textview得到正确解析和显示。 如果有人能帮我在图像视图中显示图像,那么它会很好。 谢谢。

更新:我能够解决我的特殊问题与Pankaj( https://github.com/AndroidBegin/Android-JSON-Parse-Images-and-Texts-Tutorial )共享的链接的帮助和共享的概念知识拉古南丹下面。 请仔细阅读这些答案,以获得详细的解释以及延迟加载的实现。 我很抱歉,因为我离开了两天,不能奖励答复。

使用通用图像加载器进行延迟加载。 用图像的网址替换硬编码的网址。

根据您的要求修改以下内容

什么是LazyList? 。 查看这个链接的细节。

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> 

在清单中添加权限

  <uses-permission android:name="android.permission.INTERNET"/> 

在这里输入图像描述

请用通用图像加载器试试这个

 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); } }); } } 

以下是我如何加载和缓存图像在ListView中创建用户的联系人列表。 所以想象一下左边的个人资料图片,右边的一些文本视图(这听起来接近你正在处理的问题,忽略丑陋的调试标签,可能是差的格式化(对不起),我猜这有点像LazyList,但是这里详细的解释,以防万一有人困惑。

第1步:设置您的缓存

 private LruCache<String, Bitmap> memoryCache; private HashMap<String, String> idPairs = new HashMap<String, String>(); 

在我的方法中,我使用一个LruCache和一个HashMap来跟踪我已经下载了哪些用户的图像。 你会看到如何实现后,但想法是避免从服务器下载的东西,除非你必须。 然后在你的onCreate()或者一些相关的方法中,初始化你的缓存。

  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 } }; 

我的下一步是将默认的“空图像”位图添加到缓存,以防我到达没有与之关联的图片的条目。 这样我只需要处理和添加一次这个位图

 Bitmap defaultPicture = BitmapFactory.decodeResource(getResources(), R.drawable.default_user_picture); addBitmapToMemoryCache("default", defaultPicture); 

那么是时候获取你需要的数据了!

第2步:获取数据

 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(); } } 

这里有一个Borland的AsyncTask ,它把用户数据的JSONArray作为参数。 我遗漏了这部分,因为它几乎只是一个基本的HTTP下载,不需要解释。 getUsers方法是我开始将什么将被添加到我的ListView 。 我接下来要做的是处理从服务器下载的JSON来创建用户对象,将其添加到将要显示的用户列表中。

 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()); } } 

我将图片与将最终显示的用户对象相关联。 我认为,这是不是完全浪费时间,因为图像是从位图缓存中拉出

 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; } 

如果缓存中存在图片,则返回该图片,否则将下载该图片。 对于我来说,显示用户,每张图片都按照用户标识进行缓存,即使有人在列表中出现不止一次,缓存中只会有一张图片存在。

 ImageView profile_picture = (ImageView) v.findViewById(R.id.profile_picture); if(profile_picture != null){ profile_picture.setImageBitmap(u.getProfilePicture()); } 

剩下要做的只是在适配器中找到ImageView ,并将该视图设置为与列表中的对象关联的图片。

你想要一些易于使用的东西吗? 照顾缓存文件,删除缓存,当内存在边界线时释放?

尝试LazyList,检查出来:

https://github.com/nicolasjafelle/LazyList

如上所述,您只需要在应用程序类或任何其他Activity或Fragment中创建Singleton:

 //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"); 

然后在你的视图中有ImageView来显示de Image你需要实现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); 

最后你需要在你的androidManifest.xml中添加这个权限

 <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

就是这样。 然后你有方法清除高速缓存缓存或磁盘缓存或两者的缓存。

我不知道如何存储图像,因为我的应用程序使用APK中的图像。 不过,我相信显示这些图像,你想要一个自定义Arrayadapter。

这将膨胀每个项目的布局,并将其放置在一个列表中。 这个布局由您创建的XML布局定义,并在其构造中指定。 您应该尝试扩展您当前用于列表视图的适配器,并使用根据项目设置图像视图的自定义适配器。

我用ImageView.setImageResource(资源ID)来做到这一点; 但你的里程可能会有所不同 我有我的图片在APK不知道如何显示他们从外部来源

Interesting Posts