ساخت یک لیست آرایه ای (ArrayList)، در برنامه نویسی اندروید

برای ساخت یک لیست آرایه ای (ArrayList) با نام myList ، که عناصر آن به صورت رشته (string) باشند، کدهای زیر را می نویسیم :

ArrayList<String> myList = new ArrayList<String>();

کد بالا برای زمانی است که تعداد عناصر لیست آرایه ای (ArrayList) را ندانیم، اگر تعداد عناصر را بدانیم، می توانیم لیست آرایه ای (ArrayList) را از طریق کدهای زیر بسازیم (به عنوان مثال، تعداد عناصر را برابر 10 فرض کرده ایم) :

ArrayList<String> myList = new ArrayList<String>(10);

برای تعیین عناصر لیست آرایه ای (ArrayList) در همان ابتدای ساخت آن، می توانیم مشابه کد زیر عمل کنیم :

ArrayList<String> myList = new ArrayList<String>() {{
add("A");
add("B");
add("C");
}};

برای افزودن یک عنصر جدید به لیست آرایه ای (ArrayList)، بعد از تعریف اولیه آن، کلید شماره 315 را بخوانید.

نکته مهم

به کد زیر توجه کنید، این کد باعث ایجاد خطا و بسته شدن برنامه اندروید خواهد شد :

ArrayList<String> myList = new ArrayList<String>(10);
myList.set(5, "newString");

اما این پرسش مطرح است که دلیل ایجاد خطا چیست، تنها عملیاتی که انجام داده ایم، این است که عنصر ششم آرایه را مقداردهی کرده ایم (شماره عناصر از 0 شروع می شود، بنابراین اندیس 5 متناظر با عنصر ششم لیست آرایه ای است). ایجاد خطا به این دلیل است که در خط اول کدها، تنها ظرفیت (capacity) لیست آرایه ای (ArrayList) را مشخص کرده ایم، نه اندازه (size) آن را. در واقع، لیست آرایه ای (ArrayList) که ساخته ایم، خالی (empty) می باشد.

اگر می خواهیم که حتما عنصر ششم لیست آرایه ای (ArrayList) را مقدار دهی کنیم، می توانیم کدهای زیر را بنویسیم :

ArrayList<String> myList = new ArrayList<String>(10);
for (int i = 0; i < 10; i++) {
myList.add("");
}
myList.set(5, "newString");

در این کدها، ابتدا با روش add ، تعداد 10 عنصر را به لیست آرایه ای (ArrayList) افزوده ایم که همگی آنها، برابر رشته (string) تهی می باشند. سپس عنصر ششم را برابر رشته (string) مورد نظرمان قرار داده ایم.

بد نیست این نکته را یادآوری کنیم که اگر مجبور نیستید که حتما از لیست آرایه ای (ArrayList) استفاده کنید، می توانید مقادیر مورد نظرتان را در یک آرایه از رشته ها (string) ذخیره کنید (یا آرایه ای از هر نوع که می خواهید، مثلا Integer و ...). همانند کد زیر :

String [] all_strings = new String [10];
all_strings [5] = "newString";

مشاهده می کنید که اگر یک آرایه از رشته ها (string) داشته باشیم، می توانیم هر عنصر دلخواه از آن را مقداردهی کنیم و خطایی هم ایجاد نخواهد شد.

نکته

کدهایی که در ابتدای این مبحث ذکر کردیم، برای ساخت یک لیست آرایه ای (ArrayList) بود که عناصر آن، به صورت رشته (string) هستند، چنانچه قصد داریم که عناصر لیست آرایه ای (ArrayList) از نوع دیگری باشند، باید به جای عبارت String ، عبارت مربوط به آن نوع متغیر را بنویسیم. مثلا اگر بخواهیم که عناصر لیست آرایه ای (ArrayList)، از نوع Integer باشند، کدهای زیر را می نویسیم :

ArrayList<Integer> myList = new ArrayList<Integer>(10);

نمایش یک عکس قرار گرفته در اینترنت (یک آدرس URL)، در یک ImageView ، در برنامه نویسی اندروید

تبادل اطلاعات بین برنامه اندروید و سرور اینترنتی (اینترنت)، در برنامه نویسی اندروید

روشی دیگر برای نمایش یک عکس قرار گرفته در اینترنت (یک آدرس URL)، در یک ImageView ، در برنامه نویسی اندروید

در مبحثی دیگر، نحوه نمایش یک عکس قرار گرفته در اینترنت در یک ImageView را شرح دادیم. این بار قصد داریم که روشی دیگر را بیان کنیم، زیرا بر اساس پیچیدگی برنامه اندروید، ممکن است که به روش های متفاوتی نیاز پیدا کنیم و بنابراین در سایت کلیدستان سعی می کنیم که کدها و روش های مختلفی ارائه شود.

در پروژه اندروید، یک کلاس با نام DrawableManager می سازیم (یعنی یک فایل با نام DrawableManager.java). کدهای کلاس DrawableManager را به صورت زیر می نویسیم :

package com.kelidestan.imageload;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ImageView;

public class DrawableManager {
private final Map<String, Drawable> drawableMap;

public DrawableManager() {
drawableMap = new HashMap<String, Drawable>();
}

public Drawable fetchDrawable(String urlString) {
if (drawableMap.containsKey(urlString)) {
return drawableMap.get(urlString);
}

Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
try {
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");


if (drawable != null) {
drawableMap.put(urlString, drawable);
Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
+ drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
+ drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
} else {
Log.w(this.getClass().getSimpleName(), "could not get thumbnail");
}

return drawable;
} catch (MalformedURLException e) {
Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
return null;
} catch (IOException e) {
Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
return null;
}
}

public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
if (drawableMap.containsKey(urlString)) {
imageView.setImageDrawable(drawableMap.get(urlString));
}

final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
// imageView.setImageDrawable((Drawable) message.obj);
imageView.setBackgroundDrawable((Drawable) message.obj);
}
};

Thread thread = new Thread() {
@Override
public void run() {
//TODO : set imageView to a "pending" image
Drawable drawable = fetchDrawable(urlString);
Message message = handler.obtainMessage(1, drawable);
handler.sendMessage(message);
}
};
thread.start();
}

private InputStream fetch(String urlString) throws MalformedURLException, IOException {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(urlString);
HttpResponse response = httpClient.execute(request);
return response.getEntity().getContent();
}
}

دقت کنید که نام package که در خط اول کدها نوشته شده است را باید به نام package پروژه اندروید خود تغییر بدهید.

فرض کنید که آدرس اینترنتی (آدرس URL) عکس، به صورت زیر باشد (یک آدرس فرضی) :

http://www.host.com/images/image.png

اکنون فرض کنید که در یک activity از برنامه اندروید، بخواهیم همان عکسی که آدرس URL آن را ذکر کردیم، در یک ImageView نمایش بدهیم. برای این منظور، کدهای زیر را در میان کدهای آن activity می نویسیم :

ImageView iv = (ImageView) result.findViewById(R.id.imageView1);
DrawableManager dm = new DrawableManager();
dm.fetchDrawableOnThread("http://www.host.com/images/image.png",iv);

در کد بالا، فرض کرده ایم که ImageView دارای id برابر imageView1 باشد.

دقت کنید که حتما باید اجازه دسترسی به اینترنت، به برنامه اندروید افزوده شود، بنابراین فایل AndroidManifest.xml پروژه اندروید را باز کرده و کد زیر را به آن اضافه می کنیم (افزودن اجازه دسترسی به اینترنت) :

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

چک کردن امکان خواندن و نوشتن فایل در حافظه خارجی (external storage)، در برنامه نویسی اندروید

با کد زیر می توانیم چک کنیم که آیا امکان خواندن و نوشتن در حافظه خارجی (external storage) وجود دارد یا خیر. یک پیام در خروجی نمایش داده می شود که برای هر دو مورد ((خواندن)) و ((نوشتن))، به طور جداگانه اعلام کرده که آیا امکان پذیر هستند یا خیر :

boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
// Can read and write the media
mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// Can only read the media
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
// Can't read or write
mExternalStorageAvailable = mExternalStorageWriteable = false;
}
String message ="\n\nExternal Media: readable="
+mExternalStorageAvailable+" writable="+mExternalStorageWriteable;
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();

این کد، با استفاده از Toast ، یک پیام را به مدت چند ثانیه به کاربر نمایش می دهد که در آن پیام، وضعیت امکان خواندن و نوشتن فایل در حافظه خارجی (external storage) مشخص شده است.

بد نیست نکته زیر را تذکر بدهیم :

دقت شود که هنگامی که می خواهیم با حافظه خارجی (external storage) کار کنیم، باید کدهای زیر درون AndroidManifest.xml پروژه اندروید نوشته شود (برای اجازه دادن برای ساخت فایل در حافظه خارجی و یا خواندن یک فایل از حافظه خارجی) :

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

Rapidgator.net