استفاده از LIST VIEWها برای نمایش لیست های طولانی
بسم الله الرحمن الرحیم
استفاده از LIST VIEWها برای نمایش لیست های طولانی
فصل چهارم-بخش دوم
استفاده از LIST VIEWها برای نمایش لیست های طولانی
listViewها View ی میباشند که به شما امکان نمایش لیستی از آیتم هارا می دهد. در اندروید 2 نوع از ListView ها وجود دارد: ListView and SpinnerView . در ادامه هر کدام رابامثال شرح می دهیم.
ListView
Listiew ایتم ها رابه صورت عمودی و با امکان اسکرول کردن نمایش می دهد.
یک پروژه جدید به نام BasicViews5. ایجاد کنید.
فایل asicViews5Activity.java رابه صورت زیر تغییر دهید
package com.MehrdadJavidi.BasicViews5;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class BasicViews5Activity extends ListActivity {
String[] presidents = { "Dwight D. Eisenhower", "John F. Kennedy",
"Lyndon B. Johnson", "Richard Nixon", "Gerald Ford",
"Jimmy Carter", "Ronald Reagan", "George H. W. Bush",
"Bill Clinton", "George W. Bush", "Barack Obama" };
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/** ---no need to call this---*/
/** setContentView(R.layout.main);*/
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, presidents));
}
public void onListItemClick(ListView parent, View v, int position, long id) {
Toast.makeText(this, "You have selected " + presidents[position],
Toast.LENGTH_SHORT).show();
}
}
برنامه رااجرا کنید ویک ایتم از لیست انتخاب کنید
توضیحات
اولین چیزی که بایدتوجه کنید این است که کلاس BasicViews5Activity از کلاس پایه ListActivity مشتق (extend)شده است.
ListActivity از کلاس پایه Activity مشتق شده است و ListActivity یک لیست از آیتم ها را که به وسیله دادن منبع داده (Data Source) به آن داده می شود نمایش میدهد.همچنین باید بدانید که نیاز به تغییر فایل main.xml که شامل یک ListView نمی باشد کلاس ListActivity خودش دارای یک ListView میباشد. در نتیجه شما نیاز ندارید که در متد onCreate() متد setContentView() رافراخوانی و Ui را که فایل main.xml به آن اختصاص بدهید.
/**---no need to call this---*/
/**setContentView(R.layout.main);*/
در متد onCreate() شما متد setListAdapter() را برای نمایش داده های درlistiew استفاده می کنید.
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, presidents));
متد onListItemClick() زمانی که بر روی یک آیتم کلیک می شودفراخوانی میشود.
public void onListItemClick(
ListView parent, View v, int position, long id)
{
Toast.makeText(this,
"You have selected " + presidents[position],
Toast.LENGTH_SHORT).show();
}
سپس شما نام رئیس جمهور را با کلاس Toastنمایش می دهید.
به پروژه BasicViews5 رفته و دستوارت زیر را به فایل BasicViews5Activity.java اضافه نمایید
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**---no need to call this---*/
/**setContentView(R.layout.main);*/
/**---no need to call this---*/
/**setContentView(R.layout.main);*/
/**ListView lstView = getListView();*/
/**lstView.setChoiceMode(ListView.CHOICE_MODE_NONE);*/
/**lstView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);*/
lstView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
lstView.setTextFilterEnabled(true);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_checked, presidents));
}
برنامه را اجرا کنید
شما می توانی هرآیتم راانتخاب نمایید
توضیحات
شما بابرنامه نویسی به یک شی ListView اشاره می کنید, ومتد getListView() را استفاه می کنید که list view مربوط به ListActivity را بر می گراند ودر شی ListView قرار می دهد.شمابا برنامه نویسی می توانیدرفتار ListView راتغیر. دهید با متد setChoiceMode() تعیین می کنیدکه در کدام حالت قرار گیرد که شما با دادن ListView.CHOICE_MODE_MULTIPLE به آن امکان انتخاب چندآیتم را داده اید.
ListView lstView = getListView();
/**lstView.setChoiceMode(ListView.CHOICE_MODE_NONE);*/
/**lstView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);*/
lstView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
بسیار جالب است که شما می توانید امکان Filterرا به listView بدهید. شما می توانید با متد setTextFilterEnabled() اینکار را انجا م دهید.زمانی در لیست شروع به تایپ کردن می کنید انهای که با متن تایپ شده برابر میباشد را فیلتر می کند.
lstView.setTextFilterEnabled(true);
درمثال قبل شماه مشاهده می کنید که لیست اسامی "رئیس جمهور ها " در یک آرایه ذخیره کردهایم. در برنامه های واقعی شما باید داده ها را از دیتابیس یا از فایل strings.xml بخوانید
در زیر مثالی را با strings.xml شرح می دهیم
پروژهBasicViews5 را که اخیرا ایجاد کره اید در فایل strings.xml را که درمسیرres/values می باشد به شکل زیر تغییر دهید
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">BasicViews5</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string-array name="presidents_array">
<item>Dwight D. Eisenhower</item>
<item>John F. Kennedy</item>
<item>Lyndon B. Johnson</item>
<item>Richard Nixon</item>
<item>Gerald Ford</item>
<item>Jimmy Carter</item>
<item>Ronald Reagan</item>
<item>George H. W. Bush</item>
<item>Bill Clinton</item>
<item>George W. Bush</item>
<item>Barack Obama</item>
</string-array>
</resources>
فایل BasicViews5Activity.java به صورت زیر تغییر دهید.
package com.MehrdadJavidi.basicviews5;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends ListActivity {
String[] presidents;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**---no need to call this---*/
/**setContentView(R.layout.main);*/
/**ListView lstView = getListView();*/
/**lstView.setChoiceMode(ListView.CHOICE_MODE_NONE);*/
/**lstView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);*/
lstView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
lstView.setTextFilterEnabled(true);
presidents =
getResources().getStringArray(R.array.presidents_array);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_checked, presidents));
}
public void onListItemClick(
ListView parent, View v, int position, long id)
{
Toast.makeText(this,
"You have selected " + presidents[position],
Toast.LENGTH_SHORT).show();
}
}
}
برنامه را با f11 اجرا کنید
توضیحات
ما ابتدا اسامی رئیس جمهور strings.xml را در فایل ذخیره کرده ایم
شما می توانید آن را با متدgetResources() را بدست آورید.
presidents =
getResources().getStringArray(R.array.presidents_array);
به طور کلی شما می توانید منابع ذخیره شده درفایل string.xml با متدgetResources() بدست آورید.
در مثلا زیر به شما شرح می دهیم که چگونه می توانید داده های انتخاب شده در LsitViewرا تشخیص دهید. و در آخر هم آنهای که انتخاب شده اند را مشاهده کنید.
به پروژه BasicViews5 رفته و فایل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" >
<Button
android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Show selected items" />
<ListView
android:id="@+id/android:list"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
فایل BasicViews5Activity.java به صورت زیر تغییر دهید.
package com.MehrdadJavidi.basicviews5;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends ListActivity {
String[] presidents;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView lstView = getListView();
/**lstView.setChoiceMode(ListView.CHOICE_MODE_NONE);*/
/**lstView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);*/
lstView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
lstView.setTextFilterEnabled(true);
presidents =
getResources().getStringArray(R.array.presidents_array);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_checked, presidents));
}
public void onListItemClick(
ListView parent, View v, int position, long id)
{
Toast.makeText(this,
"You have selected " + presidents[position],
Toast.LENGTH_SHORT).show();
}
public void onClick(View view) {
ListView lstView = getListView();
String itemsSelected = "Selected items: \n";
for (int i=0; i<lstView.getCount(); i++) {
if (lstView.isItemChecked(i)) {
itemsSelected += lstView.getItemAtPosition(i) + "\n";
}
}
Toast.makeText(this, itemsSelected, Toast.LENGTH_LONG).show();
}
}
برنامه رااجرا کنید. سپس ایتم ها ی را از لیست انتخاب کنید سپس بر روی دکمهShow selected items کلیک منید.
توضیحات
در مثلا های قبلی مشاهده کردید ایتم های در خود actibviy نمایش می ادیم و نیاز به اضافه کردن عنصر <ListView> به فایل main.xmlنمی باشد در مثال می بینید که listView قسمتی از activity می باشد و نیاز داریم عنصر<ListView> اضافه کنیم.
<ListView
android:id="@+id/android:list"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
سپس ui مربوط به activity را بااستفاده ازsetContentView() به آن می دهیم.
setContentView(R.layout.main);
برای پیدا این که کدام عناصر در ListView انتخاب شده است. از متدisItemChecked() استفاده می کنیم.
for (int i=0; i<lstView.getCount(); i++) {
if (lstView.isItemChecked(i)) {
itemsSelected += lstView.getItemAtPosition(i) + "\n";
}
}
Toast.makeText(this, itemsSelected, Toast.LENGTH_LONG).show();
}
getItemAtPosition مقدار ایتم انتخاب شده را بر اساس مکان داده شده بر می گر داند می گرداند
Spinner View
Spinner View برای نمایش لیستی ار آیتم ها در یک activity استفاده می شودزمانی های وجود دراد که شمامی خواهید که لیستی ار ایتم های نمایش دهید ولی نمی خواهید مانند List View کل فضای صفحه را در برگیرد در این موارد از استفاده SpinnerView. می شود. SpinnerView درهر لحضه فقط یک آیتم از لیست را نمایش می دهد.
در زیرSpinnerView را با یک مثال شرح می دهیم.
پروژه جدیدبه نام ایجاد BasicViews6. کنید
فایل 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" >
<Spinner
android:id="@+id/spinner1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawSelectorOnTop="true" />
</LinearLayout>
و فایل string.xml را بهصورت زیر تغییر دهید.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">BasicViews6</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string-array name="presidents_array">
<item>Dwight D. Eisenhower</item>
<item>John F. Kennedy</item>
<item>Lyndon B. Johnson</item>
<item>Richard Nixon</item>
<item>Gerald Ford</item>
<item>Jimmy Carter</item>
<item>Ronald Reagan</item>
<item>George H. W. Bush</item>
<item>Bill Clinton</item>
<item>George W. Bush</item>
<item>Barack Obama</item>
</string-array>
</resources>
وفایلءMaionActivity.java بهصورت زیر تغییر دهید
package com.MehrdadJavidi.basicviews6;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
public class MainActivity extends Activity {
String[] presidents;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
presidents =
getResources().getStringArray(R.array.presidents_array);
Spinner s1 = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, presidents);
s1.setAdapter(adapter);
s1.setOnItemSelectedListener(new OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> arg0,
View arg1, int arg2, long arg3)
{
int index = arg0.getSelectedItemPosition();
Toast.makeText(getBaseContext(),
"You have selected item : " + presidents[index],
Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) { }
});
}
}
برنامه را بازدن F1اجرا کنید و سپس بر رویSpinnerView کلیک کنید
دقیقا شبیهListView. می باشد و با یک متد اضافی به نام onNothingSelected() که شماباید به کار ببرید
این متد زمانی که دکمه back button زده می شود اجرا می شود.زمانی که لیست ایتم ها نمایش داده می شود و شما ایتمی را انتخاب نمی کنید.
به جای نمایش آیتم ها درArrayAdapter به عنوان یک لیست ساده شما شما می توانید آن ها به صورت radio buttons نمایش دهید برای این کار شما پارامتر ArrayAdapter را به صورت زیر تغییر دهید
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_single_choice, presidents);