PDA

View Full Version : نحوه کار با LisView



meysam jahedi
جمعه 02 آبان 1393, 14:20 عصر
سلام
اصلا از list view سر در نمیارم ، نمونه برنامه هم زیاد دیدم امام اصلا نمیتونم باهاش ارتباط برقرار کنم و درکش کنم

دوستان اگه کسی میتونه یه نمونه کد با توضیح فارسی بزاره ، اصلا سردر نمیارم تو بعضی برنامه ها یه فرم جدا با یه textview گذاشتن و آیتم ها رو تو اون نشون میدن در صورتی که تو فرم main ، یه listview دارن ! چطور باید مثلا دو یا سه ستون از جدول رو توش نشون بدیم؟

saeed_g21
جمعه 02 آبان 1393, 19:37 عصر
اونی که آیتم لیست ویو در یک لایوت جدا و خود لیست ویو در یک لایوت جدا ساخته میشه بهش میگن لیست ویو سفارشی یا شخصی سازی شده چون در این حالت چیدمان ، رنگ ها و ... آیتم های لیست ویو کاملا در دست دارید و میتوانید تغییرات دلخواه خود رو اعمال نمایید اما در حالتی که لیست ویو در یک لایوت قرار داشته باشه و براش اطلاعات داده بشه حالت استاندارد لیست ویو هست

لیست ویو سفارشی انعطاف پذیری عالی در مقابل لیست ویو استاندارد دارد


* از همین روش میتوان در گرید ویو نیز بکار برد

meysam jahedi
جمعه 02 آبان 1393, 19:51 عصر
با دستورات مقابل دوتا ستون name و family رو میخوام از دیتا بیس بخونم ، اگه بخوام به طریق لیست ویو سفارشی نشون بدم به چه صورت ؟
یه فرم به نام row دارم که دوتا textview برای name و family گذاشتم ، میخوام این دو ستون رو از طریق سفارشی اونجا تو لیست ویو نشون بدم ، میشه دستوراتش رو بنویسید؟:بوس::بامزه::خجالت:: وس:

public void refresh(){
mydb=mydata.getReadableDatabase();
Cursor recdaryafti = mydb.rawQuery("select* from tdb", null);
NAME = new String[recdaryafti.getCount()];
String[] FAMILY = new String[recdaryafti.getCount()];
int i = 0;
if(recdaryafti.moveToFirst()){
do{

NAME[i] = recdaryafti.getString(1);
FAMILY[i] = recdaryafti.getString(2);
i++;
}
while(recdaryafti.moveToNext());
}

recdaryafti.close();
mydb.close();


list.setAdapter(new ArrayAdapter <String>(this,R.layout.row,R.id.row_txtname,NAME));

}

StoPpeR
جمعه 02 آبان 1393, 20:44 عصر
ازونجایی که بیکار بودم نشستم کلش رو واستون نوشتم
ولی فقط به کپی کردنش اکتفا نکنین و سعی کنین کامل بفهمینش
چون خیلی بدردتون می خوره

اول از همه یه کلاس آداپتر میسازین برای ساختار کلی لیست ویو تا مشخص کنه برای هر ویو (که در اینجا دو تکست ویو باشه) چه چیزی رو باید انتخاب کنه و نمایش بده
توضیحات مربوط به هر دستور هم داخل کد هست

public class MyAdapter extends BaseAdapter {

//مشخص کردن داده های اولیه
Activity a;
String[] namearray;
String[] familyarray;

//تعریف دستور اصلی آداپتر برای دریافت داده های نهایی
public MyAdapter(Activity act, String[] names, String[] family) {
a = act;
this.namearray = names;
this.familyarray = family;
}


@Override
public int getCount() {
// TODO Auto-generated method stub
return namearray.length;
}


@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}


@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}


@Override
public View getView(int pos, View convertView, ViewGroup arg2) {

View mylist;
LayoutInflater inflater = (LayoutInflater) a.getSystemService(Context.LAYOUT_INFLATER_SERVICE );
if (convertView == null) {
mylist = new View(a);
//به جای مای لیست باید لایه مربوط به خودتون که دو تکستویو درش هستند رو قرار بدید
mylist = inflater.inflate(R.layout.mylist, null);
//آی دی های تکست ویوی در لایه مربوطه رو قرار بدید
TextView textView = (TextView) mylist.findViewById(R.id.textView1);
TextView textView2 = (TextView) mylist.findViewById(R.id.textView2);
//حالا هر کدوم از اسم و فامیل ها رو در تکست ویو می گذاریم
textView.setText(namearray[pos]);
textView2.setText(familyarray[pos]);
} else {
mylist = (View) convertView;
}
return mylist;
}


و بعد در اکتیویتی اصلی این آداپتر رو به لیست ویوی مورد نظرتون می چسبونین و دو آرایه ای که از دیتابیس خوندین رو درش جایگذاری می کنین:

public class MainActivity extends Activity {


private ListView list;
private String[] names;
private String[] family;
MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
list = (ListView) findViewById(R.id.listView1);
adapter = new MyAdapter(this, names, family);
list.setAdapter(adapter);
}

}


بجای String[] می تونین از ArrayList<String> هم استفاده کنین که چون دیدم در کد خودتون به اون شکله منم همونجوری زدم

سوالی بود بپرسین

meysam jahedi
شنبه 03 آبان 1393, 13:29 عصر
ازونجایی که بیکار بودم نشستم کلش رو واستون نوشتم
خیلی ممنون از لطفتون

ولی فقط به کپی کردنش اکتفا نکنین و سعی کنین کامل بفهمینش
راستش خوب نفهمیدم :گیج: یه درک کلی ازش پیدا کردم ولی ریز ریز متوجه نشدم



public View getView(int pos, View convertView, ViewGroup arg2) {
View mylist;
LayoutInflater inflater = (LayoutInflater) a.getSystemService(Context.LAYOUT_INFLATER_SERVICE );
if (convertView == null) {
mylist = new View(a);
//به جای مای لیست باید لایه مربوط به خودتون که دو تکستویو درش هستند رو قرار بدید
mylist = inflater.inflate(R.layout.mylist, null);
//آی دی های تکست ویوی در لایه مربوطه رو قرار بدید
TextView textView = (TextView) mylist.findViewById(R.id.textView1);
TextView textView2 = (TextView) mylist.findViewById(R.id.textView2);
//حالا هر کدوم از اسم و فامیل ها رو در تکست ویو می گذاریم
textView.setText(namearray[pos]);
textView2.setText(familyarray[pos]);
} else {
mylist = (View) convertView;
}
return mylist;
}






1- LayoutInflater کلا کارش چیه ؟
2 - View convertView نقشش چیه ؟ کی null میشه که براش شرط گذاشتید؟
3- int pos ، مگه pos ورودی نیست ؟ کجا بهش ورودی میرسه ؟ یعنی در خط زیر int pos از کجا بهش ورودی میاد؟ ما وقتی MyAdapter رو صدا میزنیم this و دو تا آرایه میدیم ، int pos چی میشه پس؟


public View getView(int pos, View convertView, ViewGroup arg2)





شرمنده خیلی خیلی ... خیلی مبتدیم ، ممنون میشم جواب3 سوالم رو بدید :بوس::بامزه:

StoPpeR
شنبه 03 آبان 1393, 14:15 عصر
1. layoutinflater برای آدرس دادن به ویو های مربوط به لایه ای به جز لایه ای که در "setcontentview" قرار داده شده به کار می ره
یعنی اگه بخواین مثلا یک تکست ویو یا باتن رو از یه لایه دیگه بگیرین و روی عملیاتی انجام بدین (یا در این مورد براش اطلاعاتی رو برای نمایش دادن معین کنین) باید ابتدا لایه کلی رو توسط این کلاس بگیرین و بعد آیتم هاش رو بدست بیارید
مثلا من اینجا ابتدا با این کلاس لایه کلی رو گرفتم (همون لایه ای که دو تکست ویوی مربوط به لیست ویو درش قرار داره و من اسمش رو گذاشتم mylist):
inflater.inflate(R.layout.mylist, null);
و بعد دو تکست ویوی موجود در اونرو گرفتم:
TextView textView = (TextView) mylist.findViewById(R.id.textView1);
TextView textView2 = (TextView) mylist.findViewById(R.id.textView2);

2. covertview دقیقا رابط بین این آداپتر و لایه اصلیه و چون این اتصال ارتباط رو چندین بار انجام می ده دفعه اول nullـه (چون هنوز ساخته نشده) ولی دفعات بعدی دیگه ساخته شده و همون رو بعنوان ویوی کلی return می کنیم

3. pos ورودی ایه که خود کلاس آداپتر بر مبنای ویویی که ازش استفاده میشه (که در اینجا لیست ویو باشه) در نظر می گیره و ربطی به دستوری که شما در اکتیویتی اصلی می دین نداره
بطور خلاصه pos همون مکان آیتم مورد نظر (یعنی pos = 0 میشه اولین آیتم از لیست ویو)

4. سوال 4 رو تقریبا توی سوال 1 جواب دادم، شما وقتی آداپتر رو صدا می زنید ابتدا یه context (یا همون اکتیویتی) براش تعریف می کنین که اینجا از this استفاده شده بعد داده های نهایی رو بهش می دین (که اینجا همون آرایه های نام و فامیل هستن) و کار با لایه دوم (یا به قول شما فرم دوم) در خود کلاس آداپتر انجام میشه نه در اکتیویتی اصلی

----------

اما جدای از این مسائل
ببینین اینجور سوال ها که فقط برای درک و فهم دستور ها، کلاس ها، عملکرد ها و... هستن بصورت خیلی خیلی کامل تر و قابل فهم تر در مدارک سایت سازنده هر زبان برنامه نویسی یا هر پلتفرمی موجوده
چیزی که متاسفانه خیلی هامون به هر دلیلی (یا بخاطر پایین بودن سطح زبان انگلیسی و یا شایدم تنبلی) نمیریم سراغش و فقط به کپی کردن کد ها اکتفا می کنیم
الان شما همین سوال ها رو در stackoverflow بذارین امکان نداره کسی شروع کنه توضیح دادن، فقط یه لینک از توضیحات مدارک می ذارن و تموم (که البته خیلی کار بهتری می کنن ولی خب ما ها عادت نداریم)
مثلا برای سوال اولتون اینجا از سیر تا پیاز این کلاس رو تعریف کرده و تمام دستوراتش رو هم جزئ به جزئ توضیح داده:
http://developer.android.com/reference/android/view/LayoutInflater.html

کلا بصورت منبعی اگه کار کنین خیلی سریع تر پیشرفت می کنین تا ایکه بخواین همینا رو از یه نفر دیگه بپرسین که احتمال داره نتونه خوب شیرفهم کنه (چیزی که احتمالا همینجا هم اتفاق افتاده)