ورود

View Full Version : مشکل در listview



zahra.mf
یک شنبه 27 اردیبهشت 1394, 10:42 صبح
سلام من یه لیست دارم که سطرهاش و از یه جدول تو پایگاه میگیرم کلاس لیستم این شکلی هست


private database db;
private String[] Name;


protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);
setContentView(R.layout.list_omreh);
db = new database(this);
refresh();
setListAdapter(new AA());
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {

Intent i = new Intent(list_omreh.this,list_ahkam.class);
i.putExtra("ID", "");
startActivity(i);
}



class AA extends ArrayAdapter<String>{

public AA(){
super(list_omreh.this,R.layout.row_omreh,Name);
}


public View getView(int position, View convertView, ViewGroup parent){


LayoutInflater in=getLayoutInflater();
View row =in.inflate(R.layout.row_omreh, parent, false);
TextView name =(TextView) row.findViewById(R.id.row_omreh_name);

name.setText(Name[position]);


return (row);
}
}


private void refresh(){

db.open();
int s = db.List_count_subject("subject",3);
Name= new String[s];

for(int i=0;i<s;i++){

Name[i]=db.List_display_subject("subject", i,3);

}
db.close();
}


الان میخوام روی هر کدوم از سطرها که کلیک شد بره یه لیست بیاره که این لیست جدید بر اساس این که رو کدوم سطر کلیک کردی یه سری سطر از جدول دوم میاره که این دوتا جدول با id به هم وصل هستن من الان باید onlistitemclick بگم سطری با این نام که کلیک شده روش ای دیش و پیدا کن و با ایدی جدول دوم مقایسه کن بعد ببین تو جدول دوم کدوم سطرا با این ای دی برابره اونا رو بفرست به کلاس بعدی غیر از اینه؟
یعنی value رو توی putextra نمیدونم چجوری پر کنم
کسی میتونه کمک کنه؟

gilas1368
یک شنبه 27 اردیبهشت 1394, 10:55 صبح
سلام
چندتا نکته:
1- قبل از انجام تراکنش روی بانک از ormlite برای انجام دستوراتتون روی بانک اطلاعاتی استفاده کنین ( بزودی ی آموزش ازش میذارم)
2- Adapterی ک دارید میسازید ی String هستش، پس id رو ندارید. در نتیجه یا باید ی لیست hashmap درست کنین و یا اینکه با استفاده از ormlite ی لیست از اشیاء (ک هر شی نمود ی ردیف و مشخصات اون ردیف از جدوله) درست کنین و ب Adaper پاس بدید


کار با Ormlite هم بسیار آسونه، البته اگ با Entity Framwork کار کرده باشید

zahra.mf
یک شنبه 27 اردیبهشت 1394, 10:58 صبح
سلام
چندتا نکته:
1- قبل از انجام تراکنش روی بانک از ormlite برای انجام دستوراتتون روی بانک اطلاعاتی استفاده کنین ( بزودی ی آموزش ازش میذارم)
2- Adapterی ک دارید میسازید ی String هستش، پس id رو ندارید. در نتیجه یا باید ی لیست hashmap درست کنین و یا اینکه با استفاده از ormlite ی لیست از اشیاء (ک هر شی نمود ی ردیف و مشخصات اون ردیف از جدوله) درست کنین و ب Adaper پاس بدید


کار با Ormlite هم بسیار آسونه، البته اگ با Entity Framwork کار کرده باشید


من اصلا اینایی که گفتید تا حالا نشنیدم:افسرده::ناراحت:
نمیشه بگید من چه کار کنم الان؟
از کجا یاد بگیرم؟
اموزش فارسی هست یا نه؟

atpf67
یک شنبه 27 اردیبهشت 1394, 11:14 صبح
الان میخوام روی هر کدوم از سطرها که کلیک شد بره یه لیست بیاره که این لیست جدید بر اساس این که رو کدوم سطر کلیک کردی یه سری سطر از جدول دوم میاره که این دوتا جدول با id به هم وصل هستن من الان باید onlistitemclick بگم سطری با این نام که کلیک شده روش ای دیش و پیدا کن و با ایدی جدول دوم مقایسه کن بعد ببین تو جدول دوم کدوم سطرا با این ای دی برابره اونا رو بفرست به کلاس بعدی غیر از اینه؟
یعنی value رو توی putextra نمیدونم چجوری پر کنم
کسی میتونه کمک کنه؟

سلام بزرگوار

شما ابتدا یه کلاس به صورت زیر بسازید:

class Data {
private String name;
private int id;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}

}

خب حالا به جای اینکه به ArrayAdapter تون String بفرستید Data رو بفرستید.

gilas1368
یک شنبه 27 اردیبهشت 1394, 11:16 صبح
ormlite ی چیزیه مثه entity framwork با این تفاوت ک در ef شما دیتابیس و جداول رو بهش میدید خودش بقیه کارها و کلاس ها رو براتون میسازه اما در جاوا ما چنین چیزی نداریم و شما باید خودتون آستیناتونو بالا بزنین و تمام کاراها از جمله ساختن مدل جداول- کلاس ها-و ... رو خودتون انجام بدید
در حال حاضر دارم ی pdf از طریقه کار ormlite آماده میکنم (رفرنس فارسی نداره متاسفانه)

در مورد hashmap هم شما اطلاعاتتون رو ک برگردونید بجای اینکه بریزیدشون توی ی آرایه stringی میریزیدشون توی ی hashmap (منظورمو اطلاعاتیه ک میخواید از جمله id) بعد اون hashmap رو میدید ب Adapter و حالا زمانیکه روی ی آیتم کلیک میکنین میتونید به اون id دسترسی داشته باشید

اما این روش اصلا خوب و اصولی نیس، روش اصولی و دقیقش استفاده از همون ormlite هستش

شما ی جستجو در موردش بکنین، اگ سوالی داشتید من درخدمتم

zahra.mf
یک شنبه 27 اردیبهشت 1394, 11:19 صبح
سلام بزرگوار

شما ابتدا یه کلاس به صورت زیر بسازید:

class Data {
private String name;
private int id;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}

}

خب حالا به جای اینکه به ArrayAdapter تون String بفرستید Data رو بفرستید.

این که گفتید چی هست؟
من یه مبتدی ام ساده تر بگید:ناراحت:

atpf67
یک شنبه 27 اردیبهشت 1394, 11:21 صبح
ormlite

اما این روش اصلا خوب و اصولی نیس، روش اصولی و دقیقش استفاده از همون ormlite هستش

بزرگوار میشه بیشتر توضیح بدید؟ چرا استفاده از hashmap اصولی نیست؟

atpf67
یک شنبه 27 اردیبهشت 1394, 11:35 صبح
این که گفتید چی هست؟
من یه مبتدی ام ساده تر بگید:ناراحت:

بزرگوار این یه کلاسه که خودتون با هر نام دیگه و هر جور دیگه (متغیر های دیگه، متدهای دیگه و...) می تونید بسازید، چیز خاصی نیست، بعد از اینکه ساختید، به جای اینکه یه آرایه از استرینگ رو پر کنید و بفرستید به اداپترتون یه آرایه از این کلاس بسازید، به این صورت که برای هر عضو آرایه تون یه نمونه از این کلاس می سازید و با اصلاعاتی که از دیتابیستون نیاز دارید متغیرهاشو مقداردهی میکنید و به آرایه اضافه می کنید و در نهایت می فرستید به اداپتر، توی اداپتر هم به جای این خط:

name.setText(Name[position]);

این رو می نویسید:


name.setText(Name[position]).getname();

البته باید توجه داشته باشید که اون بالا که Name رو تعریف کردید نوعش رو Data بذارید.

خب توی متد کلیک هم به اینصورت میشه:

i.putExtra("ID", Name[position].getId()+"");

gilas1368
یک شنبه 27 اردیبهشت 1394, 11:53 صبح
بزرگوار میشه بیشتر توضیح بدید؟ چرا استفاده از hashmap اصولی نیست؟

ببینید ن اینکه اصولی نباشه اما مثه این میمونه ک شما در جایی ک entity framwork وجود داره بیاید و از sqlcommand و dataAdapter و dataset یا datatable استفاده کنین
بر تمام برنامه نویسای دات نت پوشیده نیست ک ef تمام این کارها رو خودش انجام میده و شما فقط کافیه بهش بگید از این تیبل ایناها رو برام بیار، خودش میره و query رو میسازه و دیتای مورد نیاز شما رو برمیگردونه
ormlite هم همینکارو در جاوا انجام میده اما پیاده سازیش یکم زمانبره (زمان میبره، مشکل نیس) چون باید تمام کلاس ها و مدل ها رو خودتون بسازید بعد با استفاده از واسطه orm بهش بگید از چ تیبلی ک چ دیتایی رو بیاره
این تا اینجا حالا میرسیم ب بحث hashmap
ببینید شما ی select میزنین و ی دیتایی رو برمیگردونید اونم ب شکل cursor بعد دوباره با ی حلقه میاید و اون cursor رو پیمایش میکنین و ازش ی لیست میسازید و بعد با استفاده از Nodeهایی ک تعریف کردید ب مقدار اون پارامتر دست پیدا میکنین
تا اینجا شما ی کار اضافه انجام دادید و اونم اینه ک با ی حلقه دارید cursor رو پیمایش میکنین تا ی لیست بدست بیارید

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

اینکار شاید در رابطه با دیتاهای کم خیلی بچشم نیاد اما در مورد دیتاهای سنگین و رکوردهای بالا ی تاخیر محسوسی رو حس خواهید کرد (من خودم سره پروژه اخرم دقیقا حسش کردم، 2 ثانیه تاخیر در بازیابی اطلاعات و ساخت اون لیست و تبدیل اون ب ی hashmap برای دسترسی ب اطلاعات مورد نیاز داشتم) و این برای برنامه هایی ک قراره با هر سخت افزاری کار کنن اصلا خوب و منطقی نیست، ضمن اینک ممکن هسته اندروید ب علت کمبود منابع دستور ب بستن برنامه بده البته اگ قبل از اون برنامه کرش نکنه