cuốn sách gpt4 ai đã làm

Android: Trợ giúp sử dụng lớp ImageLoader (LazyList) để điều chỉnh bộ điều hợp ListView

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 00:32:54 29 4
mua khóa gpt4 Nike

Tôi có bộ điều hợp ListView tùy chỉnh triển khai lớp ImageThreadLoader. Thật không may, lớp này không bật tùy chọn bộ đệm - tải xuống hình ảnh từ web và lưu chúng dưới dạng bộ đệm.

Sau đó tôi tìm thấy cái này Danh sách lười biếnghoặc đâyRất hữu ích, nó hoạt động giống hệt như lớp ImageThreadLoader của tôi, nhưng nó có thể lưu hình ảnh làm bộ đệm. Vì vậy, tôi muốn triển khai lớp ImageLoader của nó vào bộ điều hợp ListView tùy chỉnh hiện tại của mình.

Thật không may, cấu trúc mã của tôi hoàn toàn khác với cấu trúc của Lazylist, gây ra một số xung đột trong nỗ lực của tôi. Ví dụ: LazyList sử dụng một chuỗi các chuỗi làm URL hình ảnh, mặt khác, tôi sử dụng JSON làm nguồn của URL hình ảnh.

Đó là lý do tại sao tôi cần trợ giúp ở đây để điều chỉnh bộ điều hợp ListView của mình cho phù hợp với lớp ImageLoader này.

Mã này như sau:

Lớp ImageLoader mà tôi muốn triển khai trong bộ điều hợp ListView tùy chỉnh của mình:

lớp công khai ImageLoader {

// cách triển khai bộ đệm trong bộ nhớ đơn giản nhất. Điều này nên được thay thế bằng một cái gì đó như SoftReference hoặc BitmapOptions.inPurgeable(kể từ 1.6)
HashMap riêng tư cache=new HashMap();

Tệp riêng cacheDir;

Trình tải hình ảnh công khai(Ngữ cảnh){
// Đặt mức độ ưu tiên thấp của nền. Bằng cách này, nó sẽ không ảnh hưởng đến hiệu suất giao diện người dùng.
photoLoaderThread.setPriority(Thread.NORM_PRIORITY-1);

//Tìm thư mục lưu ảnh đã lưu vào bộ nhớ cache
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=Tệp mới(android.os.Environment.getExternalStorageDirectory(),"Android/data/LazyList");
khác
cacheDir=context.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
}

int cuối cùng stub_id=R.drawable.stub;
public void DisplayImage(Chuỗi url, Hoạt động hoạt động, Chế độ xem hình ảnh trong ImageView)
{
if(cache.containsKey(url))
imageView.setImageBitmap(cache.get(url));
khác
{
queuePhoto(url, hoạt động, imageView);
imageView.setImageResource(stub_id);
}
}

riêng tư void queuePhoto(Chuỗi url, Hoạt động hoạt động, ImageView imageView)
{
// ImageView này có thể đã được sử dụng cho các hình ảnh khác trước đây nên có thể có một số tác vụ cũ trong hàng đợi nên chúng ta cần loại bỏ chúng.
photosQueue.Clean(imageView);
PhotoToLoad p=PhotoToLoad mới(url, imageView);
được đồng bộ hóa(photosQueue.photosToLoad){
photosQueue.photosToLoad.push(p);
photosQueue.photosToLoad.notifyAll();
}

//bắt đầu chủ đề nếu nó chưa bắt đầu
if(photoLoaderThread.getState()==Thread.State.NEW)
photoLoaderThread.start();
}

Bitmap riêng tư getBitmap(Chuỗi url)
{
// Tôi xác định hình ảnh bằng mã băm. Không phải là giải pháp hoàn hảo, tốt cho bản demo.
Tên tệp chuỗi=String.valueOf(url.hashCode());
Tệp f=Tệp mới (cacheDir, tên tệp);

// từ bộ đệm SD
Bitmap b = giải mãFile(f);
if(b!=null)
return b;

// từ web
thử {
Bitmap bitmap=null;
InputStream là=URL mới(url).openStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
bitmap = giải mãFile(f);
trả về bitmap;
} bắt (Ngoại lệ cũ){
ex.printStackTrace();
return null;
}
}

// giải mã hình ảnh và chia tỷ lệ để giảm mức tiêu thụ bộ nhớ
Giải mã bitmap riêng tưFile(File f){
thử {
// giải mã kích thước ảnh
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(FileInputStream(f),null,o);

//Tìm giá trị đúng của thang đo. Nó phải là lũy thừa của 2.
int cuối cùng REQUIRED_SIZE=70;
int width_tmp=o.outWidth, Height_tmp=o.outHeight;
tỷ lệ int=1;
trong khi(đúng){
if(width_tmp/2<>
phá vỡ;
width_tmp/=2;
chiều cao_tmp/=2;
tỷ lệ*=2;
}

// giải mã bằng inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=tỷ lệ;
trả về BitmapFactory.decodeStream(FileInputStream(f), null, o2);
} bắt (FileNotFoundException e) {}
return null;
}

//Nhiệm vụ cho hàng đợi
lớp riêng PhotoToLoad
{
url chuỗi công khai;
Chế độ xem hình ảnh công khai Chế độ xem hình ảnh;
công khai PhotoToLoad(Chuỗi u, ImageView i){
url=u;
imageView=i;
}
}

PhotosQueue photosQueue=New PhotosQueue();

public void stopThread()
{
photoLoaderThread.interrupt();
}

//lưu trữ danh sách ảnh cần tải xuống
lớpẢnhHàng đợi
{
ngăn xếp riêng tư photosToLoad=ngăn xếp mới();

// xóa tất cả các phiên bản của ImageView này
public void Clean(hình ảnh ImageView)
{
for(int j=0 ;j<>
if(photosToLoad.get(j).imageView==hình ảnh)
photosToLoad.remove(j);
khác
++j;
}
}
}

lớp PhotosLoader mở rộng Chủ đề {
công khai void run() {
thử {
trong khi (đúng)
{
//luồng đợi cho đến khi có bất kỳ hình ảnh nào được tải trong hàng đợi
if(photosQueue.photosToLoad.size()==0)
được đồng bộ hóa(photosQueue.photosToLoad){
photosQueue.photosToLoad.wait();
}
if(photosQueue.photosToLoad.size()!=0)
{
PhotoToLoad photoToLoad;
được đồng bộ hóa(photosQueue.photosToLoad){
photoToLoad=photosQueue.photosToLoad.pop();
}
Bitmap bmp=getBitmap(photoToLoad.url);
cache.put(photoToLoad.url, bmp);
Thẻ đối tượng=photoToLoad.imageView.getTag();
if(tag!=null && ((String)tag).equals(photoToLoad.url)){
BitmapDisplayer bd=bitmapDisplayer mới (bmp, photoToLoad.imageView);
Hoạt động a=(Hoạt động)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
if(Thread.interrupted())
phá vỡ;
}
} bắt (InterruptedException e) {
//cho phép thread thoát
}
}
}

PhotosLoader photoLoaderThread=New PhotosLoader();

// Được sử dụng để hiển thị bitmap trong luồng UI
lớp BitmapDisplayer triển khai Runnable
{
Bản đồ bitmap;
ImageView imageView;
public BitmapDisplayer(Bitmap b, ImageView i){bitmap=b;imageView=i;}
public void run()
{
if(bitmap!=null)
imageView.setImageBitmap(bitmap);
khác
imageView.setImageResource(stub_id);
}
}

khoảng trống công khai ClearCache() {
//xóa bộ nhớ đệm
cache.clear();

// xóa bộ nhớ đệm SD
Tệp[] files=cacheDir.listFiles();
for(Tệp f:tệp)
f.delete();
}

}

Bộ điều hợp ListView tùy chỉnh từ dự án LazyList:

lớp công khai LazyAdapter mở rộng BaseAdapter {

hoạt động hoạt động cá nhân;
dữ liệu Chuỗi [] riêng tư;
tĩnh riêng LayoutInflater inflater=null;
Trình tải hình ảnh công khai Trình tải hình ảnh;

public LazyAdapter(Hoạt động a, String[] d) {
hoạt động = a;
dữ liệu=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=ImageLoader mới(activity.getApplicationContext());
}

công khai int getCount() {
trả về dữ liệu.length;
}

Đối tượng công khai getItem(int location) {
trở lại vị trí;
}

công khai getItemId (vị trí int) {
trở lại vị trí;
}

lớp tĩnh công khai ViewHolder{
văn bản TextView công khai;
hình ảnh ImageView công khai;
}

Chế độ xem công khai getView(int location, View ConvertView, ViewGroup parent) {
Xem vi=convertView;
Người giữ ViewHolder;
if(convertView==null){
vi = inflater.inflate(R.layout.item, null);
chủ sở hữu=ViewHolder mới();
Holder.text=(TextView)vi.findViewById(R.id.text);;
Holder.image=(ImageView)vi.findViewById(R.id.image);
vi.setTag(người giữ);
}
khác
Holder=(ViewHolder)vi.getTag();

Holder.text.setText("item "+position);
Holder.image.setTag(data[position]);
imageLoader.DisplayImage(dữ liệu[vị trí], hoạt động, chủ.image);
return vi;
}
}

Đây là bộ điều hợp ListView tùy chỉnh của tôi:Lớp ProjectAdapter

lớp công khai ProjectAdapter mở rộng ArrayAdapter {

tài nguyên int;
Phản hồi chuỗi;
Bối cảnh bối cảnh;
Chuỗi tĩnh cuối cùng riêng tư TAG = "MediaItemAdapter";

riêng tư ImageThreadLoader imageLoader = new ImageThreadLoader();

//Khởi tạo bộ chuyển đổi
public ProjectAdapter(Ngữ cảnh, tài nguyên int, Danh sách mục) {
super(bối cảnh, tài nguyên, vật phẩm);
this.resource=resource;
}

@Ghi đè
Chế độ xem công khai getView(int location, View ConvertView, ViewGroup parent)
{
Tiêu đề văn bản TextView;
hình ảnh ImageView cuối cùng;

Dự án pro = getItem(position);

Dự án LinearLayoutView;
// Tăng cường tầm nhìn
if(convertView==null)
{
projectView = new LinearLayout(getContext());
Trình tăng chuỗi = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater vi;
vi = (LayoutInflater)getContext().getSystemService(inflater);
vi.inflate(resource, projectView, true);
}
khác
{
projectView = (LinearLayout) ConvertView;
}

thử {
textTitle = (TextView)projectView.findViewById(R.id.txt_title);
hình ảnh = (ImageView)projectView.findViewById(R.id.image);
} bắt(ClassCastException e) {
Log.e(TAG, "Bố cục của bạn phải cung cấp hình ảnh và chế độ xem văn bản cùng với biểu tượng và văn bản của ID.", e);
throw e;
}


Bitmap cachedImage = null;
thử {
cachedImage = imageLoader.loadImage(pro.smallImageUrl, new ImageLoadedListener() {
public void imageLoaded(Bitmap imageBitmap) {
image.setImageBitmap(imageBitmap);
thông báoDataSetChanged();
});
} bắt (MalformedURLException e) {
Log.e(TAG, "URL hình ảnh từ xa xấu: " + pro.smallImageUrl, e);
}

textTitle.setText(pro.project_title);

if( cachedImage != null ) {
image.setImageBitmap(cachedImage);
}

trả về projectView;
}

}

Cảm ơn bạn rất nhiều!!

biên tập

gia hạn:Danh sách dự ánHoạt động

    lớp công khai ProjectList mở rộng Hoạt động {
/** Được gọi khi hoạt động được tạo lần đầu tiên */
//ListView sẽ giữ các tham chiếu các mục của chúng ta trở lại main.xml
ListView lstTest;
// Bộ điều hợp mảng sẽ giữ ArrayList của chúng ta và hiển thị các mục trên ListView
ProjectAdapter arrayAdapter;
Hộp thoại ProgressDialog;
// Danh sách sẽ lưu trữ các mục của chúng tôi và cho phép chúng tôi sửa đổi bộ điều hợp mảng đó
ArrayList prjcts=null;
@Ghi đè
khoảng trống công khai onCreate(Gói đã lưuInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.projects_list);
//Khởi tạo ListView
lstTest= (ListView)findViewById(R.id.lstText);

// Khởi tạo ArrayList của chúng tôi
prjcts = new ArrayList();
//Khởi tạo bộ điều hợp mảng của chúng tôi, lưu ý cách nó tham chiếu bố cục listitems.xml
arrayAdapter = new ProjectAdapter(ProjectsList.this, R.layout.listitems,prjcts,ProjectsList.this);

// Đặt bộ chuyển đổi ở trên làm bộ chuyển đổi được lựa chọn cho danh sách của chúng tôi
lstTest.setAdapter(arrayAdapter);

nếu (isOnline())
{
// Khởi tạo Lớp dịch vụ web bằng URL của dịch vụ web mà bạn không phải vượt qua
//WebService webService = WebService mới("http://notalentrocks.com/myplaceapp/projects.json");
Dịch vụ web WebService = Dịch vụ web mới ("http://liebenwald.spendino.net/admanager/dev/android/projects.json");

// Truyền tham số nếu cần, nếu không thì truyền tham số giả như sau
Map params = new HashMap();
params.put("var", "");

// Nhận phản hồi JSON từ máy chủ, "" là nơi tên phương thức thường xuất hiện nếu cần ví dụ
// webService.webGet("getMoreAllerts", params);
Phản hồi chuỗi = webService.webGet("", params);

thử
{
hộp thoại = ProgressDialog.show(ProjectsList.this, "", "Đang tìm nạp dự án...", true);
hộp thoại.setCancelable(true);
hộp thoại.setCanceledOnTouchOutside(true);
hộp thoại.setOnCancelListener(OnCancelListener mới() {
public void onCancel(hộp thoại DialogInterface) {

}
});
// Phân tích phản hồi vào đối tượng của chúng tôi
Nhập CollectionType = new TypeToken<>>(){}.getType();

//JSON mong đợi một danh sách nên không thể sử dụng ArrayList của chúng tôi từ đầu
List lst= new Gson().fromJson(response, CollectionType);


// Bây giờ chúng ta đã có danh sách đó, hãy thêm nó vào ArrayList để chứa các mục của chúng ta.
for(Dự án l : lst)
{
prjcts.add(l);
ConstantData.projectsList.add(l);
}

//Vì chúng ta đã sửa đổi arrayList nên bây giờ chúng ta cần thông báo cho adapter rằng
// dữ liệu của nó đã thay đổi để cập nhật giao diện người dùng
arrayAdapter.notifyDataSetChanged();
hộp thoại.dismiss();
}
bắt (Ngoại lệ e)
{
Log.d("Lỗi: ", e.getMessage());
}
}
lstTest.setOnItemClickListener(OnItemClickListener mới() {
public void onItemClick(AdapterView parent, View view, int location, long id) {
Chăm sóc ý định = Ý định mới(ProjectsList.this, ProjectDetail.class);
care.putExtra("spendino.de.ProjectDetail.position",position);
startActivity(care);
}
});

}

boolean được bảo vệ isOnline() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
trả về đúng sự thật;
} khác {
Hộp thông báo AlertDialog.Builder = new AlertDialog.Builder(this);
Alertbox.setTitle("spendino Helfomat");
notificationbox.setMessage ("Vui lòng kiểm tra kết nối internet của bạn");
Alertbox.setPositiveButton("OK", DialogInterface mới.OnClickListener() {
public void onClick(hộp thoại DialogInterface, int id) {
//Main.this.finish();
}
});
hộp cảnh báo.show();
trả về sai;
}
}



}

đã cập nhậtĐây là stacktrace của tôi:

05-12 11:36:52.670: LỖI/AndroidRuntime(299): Nguyên nhân: java.lang.NullPointerException
12-05 11:36:52.670: LỖI/AndroidRuntime(299): tại android.content.ContextWrapper.getCacheDir(ContextWrapper.java:183)
05-12 11:38:29.386: LỖI/AndroidRuntime(324): tại chi tiêu.de.ImageLoader.(ImageLoader.java:41)
05-12 11:36:52.670: LỖI/AndroidRuntime(299): tại chi tiêu.de.Main.(Main.java:56)

Trình tải hình ảnh 41 là:cacheDir=context.getCacheDir();Chính 56 là:riêng tư ImageLoaderCache imageLoader = new ImageLoaderCache(Main.this);

chính.java

Lớp công khai Main mở rộng Hoạt động { /** Được gọi khi Hoạt động được tạo lần đầu tiên. */

ArrayList prjcts=null;
Chuỗi tĩnh cuối cùng riêng tư TAG = "MediaItemAdapter";
Trình tải hình ảnh Trình tải hình ảnh;
hoạt động hoạt động cá nhân;
Hình ảnhXem hình ảnh1;
ImageView image2;
ImageView image3;

@Ghi đè
khoảng trống công khai onCreate(Gói đã lưuInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

nếu (isOnline())
{


prjcts = new ArrayList();
Dịch vụ web WebService = Dịch vụ web mới ("http://liebenwald.spendino.net/admanager/dev/android/projects.json");
Map params = new HashMap();
params.put("var", "");
Phản hồi chuỗi = webService.webGet("", params);

imageLoader = ImageLoader mới(Main.this);
thử
{
Nhập CollectionType = new TypeToken<>>(){}.getType();
List lst= new Gson().fromJson(response, CollectionType);
for(Dự án l : lst)
{
prjcts.add(l);
ConstantData.projectsList.add(l);
}
}
bắt (Ngoại lệ e)
{
Log.d("Lỗi: ", e.getMessage());
}

thử {
image1 = (ImageView)findViewById(R.id.top1);
image2 = (ImageView)findViewById(R.id.top2);
image3 = (ImageView)findViewById(R.id.top3);
} bắt(ClassCastException e) {
Log.e(TAG, "Bố cục của bạn phải cung cấp hình ảnh và chế độ xem văn bản cùng với biểu tượng và văn bản của ID.", e);
throw e;
}

// ngẫu nhiên hóa chỉ mục của hình ảnh

int max = prjcts.size();
Danh sách chỉ số = new ArrayList(max);
for(int c = 1; c < max; ++c)
{
chỉ số.add (c);
}

Random r = new Random();
int ArrayIndex = r.nextInt(indices.size());
int RandomIndex1 =index.get(arrIndex);
chỉ số.remove(arrIndex);

int ArrayIndex2 = r.nextInt(indices.size());
int RandomIndex2 = chỉ số.get(arrIndex2);
chỉ số.remove(arrIndex2);

int ArrayIndex3 = r.nextInt(indices.size());
int RandomIndex3 =index.get(arrIndex3);
chỉ số.remove(arrIndex3);


imageLazy(image1, prjcts.get(randomIndex1));
imageLazy(image2, prjcts.get(randomIndex2));
imageLazy(image3, prjcts.get(randomIndex3));

image1.setOnClickListener(RandomClickListener mới(randomIndex1));
image2.setOnClickListener(RandomClickListener mới(randomIndex2));
image3.setOnClickListener(RandomClickListener mới(randomIndex3));
}

dự án Nút cuối cùng = (Nút) findViewById(R.id.btn_projectslist);
Thông tin nút cuối cùng = (Nút) findViewById(R.id.btn_infos);
Liên hệ nút cuối cùng = (Nút) findViewById(R.id.btn_contact);
project.setOnClickListener(project_listener);
infos.setOnClickListener(infos_listener);
contact.setOnClickListener(contact_listener);
}

/*
* isOnline - Kiểm tra xem có NetworkConnection không
* @return boolean
*/
boolean được bảo vệ isOnline() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
trả về đúng sự thật;
} khác {
Hộp thông báo AlertDialog.Builder = new AlertDialog.Builder(this);
Alertbox.setTitle("spendino Helfomat");
Alertbox.setMessage ("Bitte überprüfen Sie Ihre Internetverbindung");
Alertbox.setPositiveButton("OK", DialogInterface mới.OnClickListener() {
public void onClick(hộp thoại DialogInterface, int id) {
Main.this.finish();
}
});
hộp cảnh báo.show();
trả về sai;
}
}

lớp tĩnh công khai ViewHolder{
hình ảnh ImageView công khai;
}

public void imageLazy(hình ảnh ImageView cuối cùng, Project pro)
{
imageLoadery.displayImage(pro.smallImageUrl, hoạt động, hình ảnh);
}

public void setImage(Bitmap cachedImage, hình ảnh ImageView cuối cùng, Project pro)
{
thử {
cachedImage = imageLoader.loadImage(pro.smallImageUrl, ImageLoadedListener mới()
{
hình ảnh trống công khai đã được tải(Hình ảnh bitmapBitmap)
{
image.setImageBitmap(imageBitmap);
}
});
} bắt (MalformedURLException e) {
Log.e(TAG, "URL hình ảnh từ xa xấu: " + pro.smallImageUrl, e);
}
if( cachedImage != null ) {
image.setImageBitmap(cachedImage);
}
}

lớp công khai RandomClickListener triển khai View.OnClickListener
{
int cuối cùng riêng tư RandomIndex;

Public RandomClickListener(int RandomIndex cuối cùng)
{
this.randomIndex = RandomIndex;
}
@Ghi đè
khoảng trống công khai trênClick(Xem v)
{
Ý định hàng đầu = Ý định mới (Main.this, ProjectDetail.class);
top.putExtra("spendino.de.ProjectDetail.position", RandomIndex);
startActivity(trên cùng);
}
}

Dấu vết ngăn xếp:

12-05 13:48:12.606: LỖI/AndroidRuntime(433): tại chi tiêuino.de.ImageLoaderCache$PhotosLoader.run(ImageLoaderCache.java:244)

câu trả lời hay nhất

Có vẻ như bạn không sử dụng bất kỳ ngăn chứa Chế độ xem nào trong bộ điều hợp

Tôi đã thực hiện thay đổi đối với lớp học của bạn. Hy vọng nó hiệu quả với bạn mà không gặp bất kỳ khó khăn nào

ImageThreadLoader

 nhập java.io.File;
nhập java.io.FileInputStream;
nhập java.io.FileNotFoundException;
nhập java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
nhập java.net.URL;
nhập java.util.HashMap;
nhập java.util.Stack;

import android.app.Activity;
nhập android.content.Context;
nhập android.graphics.Bitmap;
nhập android.graphics.BitmapFactory;
nhập android.widget.ImageView;

lớp công khai ImageThreadLoader {

// cách triển khai bộ đệm trong bộ nhớ đơn giản nhất. Điều này nên được thay thế bằng một cái gì đó như SoftReference hoặc BitmapOptions.inPurgeable(kể từ 1.6)
/** Bộ đệm */
HashMap riêng tư cache=new HashMap();

/** Thư mục bộ đệm */
Tệp riêng cacheDir;

/**
* Khởi tạo trình tải hình ảnh mới.
*
* @param bối cảnh bối cảnh
*/
public ImageThreadLoader(Ngữ cảnh bối cảnh){
// Đặt mức độ ưu tiên thấp của nền. Bằng cách này, nó sẽ không ảnh hưởng đến hiệu suất giao diện người dùng.
photoLoaderThread.setPriority(Thread.NORM_PRIORITY-1);

//Tìm thư mục lưu ảnh đã lưu vào bộ nhớ cache
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=Tệp mới(android.os.Environment.getExternalStorageDirectory(),"cache_dir_img");
khác
cacheDir=context.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
}
// Cái này được sử dụng cho sơ khai khi người dùng không thể nhìn thấy hình ảnh thực tế..
// hình ảnh này sẽ được nhìn thấy
int stub_id cuối cùng =R.drawable.sample_image;


/**
* Hiển thị hình ảnh.
*
* @param url url
* @param hoạt động hoạt động
* @param imageXem chế độ xem hình ảnh
*/
public void displayImage(Chuỗi url, Hoạt động hoạt động, Chế độ xem hình ảnh ImageView)
{
if(cache.containsKey(url))
imageView.setImageBitmap(cache.get(url));
khác
{
queuePhoto(url, hoạt động, imageView);
imageView.setImageResource(stub_id);
}
}

/**
* Ảnh xếp hàng.
*
* @param url url
* @param hoạt động hoạt động
* @param imageXem chế độ xem hình ảnh
*/
riêng tư void queuePhoto(Chuỗi url, Hoạt động hoạt động, ImageView imageView)
{
// ImageView này có thể đã được sử dụng cho các hình ảnh khác trước đây nên có thể có một số tác vụ cũ trong hàng đợi nên chúng ta cần loại bỏ chúng.
photosQueue.Clean(imageView);
PhotoToLoad p=PhotoToLoad mới(url, imageView);
được đồng bộ hóa(photosQueue.photosToLoad){
photosQueue.photosToLoad.push(p);
photosQueue.photosToLoad.notifyAll();
}

//bắt đầu chủ đề nếu nó chưa bắt đầu
if(photoLoaderThread.getState()==Thread.State.NEW)
photoLoaderThread.start();
}

/**
* Lấy bitmap.
*
* @param url url
* @return bitmap
*/
Bitmap riêng tư getBitmap(Chuỗi url)
{
// Tôi xác định hình ảnh bằng mã băm. Không phải là giải pháp hoàn hảo, tốt cho bản demo.
Tên tệp chuỗi=String.valueOf(url.hashCode());
Tệp f=Tệp mới (cacheDir, tên tệp);

// từ bộ đệm SD
Bitmap b = giải mãFile(f);
if(b!=null)
return b;

// từ web
thử {
Bitmap bitmap=null;
InputStream là=URL mới(url).openStream();
OutputStream os = new FileOutputStream(f);
copyStream(is,os);
os.close();
bitmap = giải mãFile(f);
trả về bitmap;
} bắt (Ngoại lệ cũ){
ex.printStackTrace();
return null;
}
}

// giải mã hình ảnh và chia tỷ lệ để giảm mức tiêu thụ bộ nhớ
/**
* Giải mã tập tin.
*
* @param f the f
* @return bitmap
*/
Giải mã bitmap riêng tưFile(File f){
thử {
// giải mã kích thước ảnh
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(FileInputStream(f),null,o);

//Tìm giá trị đúng của thang đo. Nó phải là lũy thừa của 2.
int cuối cùng REQUIRED_SIZE=70;
int width_tmp=o.outWidth, Height_tmp=o.outHeight;
tỷ lệ int=1;
trong khi(đúng){
if(width_tmp/2<>
phá vỡ;
width_tmp/=2;
chiều cao_tmp/=2;
tỷ lệ++;
}

// giải mã bằng inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=tỷ lệ;
trả về BitmapFactory.decodeStream(FileInputStream(f), null, o2);
} bắt (FileNotFoundException e) {}
return null;
}

//Nhiệm vụ cho hàng đợi
/**
* Lớp PhotoToLoad.
*/
lớp riêng PhotoToLoad
{

/** Địa chỉ */
url chuỗi công khai;

/** Chế độ xem hình ảnh */
Chế độ xem hình ảnh công khai Chế độ xem hình ảnh;

/**
* Tạo một bức ảnh mới để tải.
*
* @param bạn là bạn
* @param tôi là tôi
*/
công khai PhotoToLoad(Chuỗi u, ImageView i){
url=u;
imageView=i;
}
}

/** Hàng đợi ảnh */
PhotosQueue photosQueue=New PhotosQueue();

/**
* Dừng chủ đề.
*/
public void stopThread()
{
photoLoaderThread.interrupt();
}

//lưu trữ danh sách ảnh cần tải xuống
/**
* Hàng đợi ảnh lớp.
*/
lớpẢnhHàng đợi
{

/** Những bức ảnh cần tải */
ngăn xếp riêng tư photosToLoad=ngăn xếp mới();

// xóa tất cả các phiên bản của ImageView này
/**
*Lau dọn.
*
* @param hình ảnh hình ảnh
*/
public void Clean(hình ảnh ImageView)
{
for(int j=0 ;j<>
if(photosToLoad.get(j).imageView==hình ảnh)
photosToLoad.remove(j);
khác
++j;
}
}
}

/**
* Trình tải ảnh lớp.
*/
lớp PhotosLoader mở rộng Chủ đề {

/* (không phải Javadoc)
* @xem java.lang.Thread#run()
*/
công khai void run() {
thử {
trong khi (đúng)
{
//luồng đợi cho đến khi có bất kỳ hình ảnh nào được tải trong hàng đợi
if(photosQueue.photosToLoad.size()==0)
được đồng bộ hóa(photosQueue.photosToLoad){
photosQueue.photosToLoad.wait();
}
if(photosQueue.photosToLoad.size()!=0)
{
PhotoToLoad photoToLoad;
được đồng bộ hóa(photosQueue.photosToLoad){
photoToLoad=photosQueue.photosToLoad.pop();
}
Bitmap bmp=getBitmap(photoToLoad.url);
cache.put(photoToLoad.url, bmp);
if(((String)photoToLoad.imageView.getTag()).equals(photoToLoad.url)){
BitmapDisplayer bd=bitmapDisplayer mới (bmp, photoToLoad.imageView);
Hoạt động a=(Hoạt động)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
if(Thread.interrupted())
phá vỡ;
}
} bắt (InterruptedException e) {
//cho phép thread thoát
}
}
}

/** Chuỗi tải ảnh */
PhotosLoader photoLoaderThread=New PhotosLoader();

// Được sử dụng để hiển thị bitmap trong luồng UI
/**
* Lớp BitmapDisplayer.
*/
lớp BitmapDisplayer triển khai Runnable
{

/** Bản đồ bit */
Bản đồ bitmap;

/** Chế độ xem hình ảnh */
ImageView imageView;

/**
* Khởi tạo một trình hiển thị bitmap mới.
*
* @param b the b
* @param tôi là tôi
*/
public BitmapDisplayer(Bitmap b, ImageView i){bitmap=b;imageView=i;}

/* (không phải Javadoc)
* @xem java.lang.Runnable#run()
*/
public void run()
{
if(bitmap!=null)
imageView.setImageBitmap(bitmap);
khác
imageView.setImageResource(stub_id);
}
}

/**
* Xóa bộ nhớ đệm.
*/
khoảng trống công khai ClearCache() {
//xóa bộ nhớ đệm
cache.clear();

// xóa bộ nhớ đệm SD
Tệp[] files=cacheDir.listFiles();
for(Tệp f:tệp)
f.delete();
}

public static void copyStream(InputStream is, OutputStream os) {
int cuối cùng buffer_size=1024;
thử
{
byte[] byte=byte mới[buffer_size];
vì(;;)
{
int count=is.read(byte, 0, buffer_size);
nếu(đếm==-1)
phá vỡ;
os.write(byte, 0, số đếm);
}
}
bắt(Ngoại lệ cũ){}
}


}

bây giờ của bạnDự ánAdapter

nhập java.util.List;

import android.app.Activity;
nhập android.content.Context;
nhập android.view.LayoutInflater;
nhập android.view.View;
nhập android.view.ViewGroup;
nhập android.widget.ArrayAdapter;
nhập android.widget.ImageView;
nhập android.widget.TextView;

lớp công khai ProjectAdapter mở rộng ArrayAdapter {

tài nguyên int;
Phản hồi chuỗi;
Bối cảnh bối cảnh;
Danh sách các mục ;
ImageThreadLoader riêng tư imageLoader;
LayoutInflater mInflater;
Hoạt động hoạt động;

//Khởi tạo bộ chuyển đổi
public ProjectAdapter(Ngữ cảnh, tài nguyên int, các mục Danh sách,
Hoạt động hoạt động) {
super(bối cảnh, tài nguyên, vật phẩm);
this.resource = tài nguyên;
imageLoader = new ImageThreadLoader(context);
this.items = vật phẩm;
bối cảnh mInflater = (LayoutInflater)
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.activity = hoạt động;
}

@Ghi đè
Chế độ xem công khai getView(int location, View ConvertView, ViewGroup parent) {

Người giữ ViewHolder = null;

// Tăng cường tầm nhìn
if (convertView == null) {

ConvertView = mInflater.inflate(resource, null);
chủ = ViewHolder mới();
Holder.image = (ImageView) ConvertView.findViewById(R.id.image);
Holder.textTitle = (TextView) ConvertView
.findViewById(R.id.txt_title);
ConvertView.setTag(holder);

} khác {
chủ sở hữu = (ViewHolder) ConvertView.getTag();
}

Dự án dự án = items.get(position);

Holder.textTitle.setText(project.project_title);

Chuỗi imageurl = project.smallImageUrl;
Holder.image.setTag(imageurl);
imageLoader.displayImage(imageurl,hoạt động,holder.image);
trả về ConvertView;

}

lớp tĩnh ViewHolder {

Tiêu đề văn bản TextView;

Hình ảnh Xem hình ảnh;
}

Cuối cùng, khi bạn lấy được dữ liệu mạng trong ListView Sử dụng điều này khi thiết lập bộ chuyển đổi trong

your_listview.setAdapter(your_ProjectAdapter_instance );
your_ProjectAdapter_instance .notifyDataSetChanged();

Về Android: Để giúp sử dụng lớp ImageLoader (LazyList) nhằm điều chỉnh bộ điều hợp ListView, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/5867894/

29 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress