View Full Version : بهم ریخته شدن دیتابیس
hamedjj
یک شنبه 25 اسفند 1392, 12:16 عصر
سلام
من یه لیست ویو شخصی دارم که یه دکمه هم توش قرار دادم
دیتابیس من هم از سه تا ستون (نام - فامیلی - سن) تشکیل شده
من دیتابیس را فواخوانی کردم و نام و فامیلی هر فرد کاملا درست در لیست ویو قرار گرفت
بر روی دکمه هم toast قرار دادم که با لمس کردم سن اون شخص را نشان بده
موارد بالا را که حتما میدونین در کلاس arrayAdapter قرار داره
اما با لمس کردن دکمه سن فرد را درست نشون نمیده و مثلا رو اولی میزنی سن نفر پنجم یا هشتم (چند تا جلوتر) را نشون میده
اگه همون ستون سن را در لیست ویو به جای مثلا فایلی نمایش بدی کاملا درست بالا میاد.
کسی میدونه مشکل از کجاست؟؟
کسی همچین مشکلی نداشت؟؟
TextView tv1 = (TextView)view.findViewById(R.id.txt_name);
TextView tv2 = (TextView)view.findViewById(R.id.txt_numer);
tv1.setText(cursor.getString(2));
tv2.setText(cursor.getString(3));
btn.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), cursor.getString(1), Toast.LENGTH_LONG).show();
}
});
smemamian
یک شنبه 25 اسفند 1392, 12:28 عصر
یک بار از تمامی رکوردها به ترتیبی که نام - فامیلی - سن کنارهم باشن خروجی بگیر
ببین تمامی اطلاعات به درستی قرار گرفتن. تمامی ستون ها رو هنگام تعریف کردنشون
توی دستورات SQL به صورت not null در نظر بگیر.
hamedjj
یک شنبه 25 اسفند 1392, 12:45 عصر
هر سه تا را با هم فراخوندم ... کاملا درست بود
تو کلاس mainActivity بر روی لیست ویو اگه toast قرار بدی مشکلی نداره و سن را نشون میده اما تو کلاس adapter این مشکل هست
اگه نیازی هست فایل جاوا یا پروژه را براتون قرار بدم
smemamian
یک شنبه 25 اسفند 1392, 13:42 عصر
نه نیازی به کد نیست. مثال زیر رو دانلود کن، توی کلاس Adapter
ببین چطوری من به ازای هر Button تابع setOnClickListener رو
فراخوانی کردم و positionهر سطر رو درآوردم :
http://www.uplooder.net/cgi-bin/dl.cgi?key=2d403e6095a3adc26d515d9e6e15062d
hamedjj
یک شنبه 25 اسفند 1392, 21:42 عصر
ممنون از پروژه ای که گذاشتی
من همه اینها را میدونم
شما این پروژه نمونه را ببینید تا مشکل را دقیقا متوجه بشوید
http://upir.ir/files92be/1da689c3ea4e1.zip
برای معرفی دیتابیس از لایبری sqlite asset helper استفاده مردم که راحت تره اما با همین جوری با databaseOpenHelper هم نوشتم همون شد.
پروژه را باز کردی رو دکمه call کلیک کن.
http://upir.ir/files92be/a7d4010d339f1.gif
poorman
یک شنبه 25 اسفند 1392, 23:33 عصر
سلام
مشکل از خوندن اطلاعات از cursor هست، اینطور به نظر میرسه که cursor شما فقط سطر اول رو برمیگردونه برای آیدی
حالا بازم من دقیق وقت نکردم نگاه کنم
اما برای حل مشکل و دقت بیشتر، بهتره شما توی اکتیویتی اطلاعات رو از دیتابیس بخونی و داخل آرایه بذاری، بعد آرایه ها رو به آداپتر بفرستی و اونجا با استفاده از position اطلاعات رو نمایش بدی و تابع کلیک رو تعریف کنی
smemamian
دوشنبه 26 اسفند 1392, 09:48 صبح
خب مشخص هست که Cursor فقط با توجه به Scroll کردن لیـــست
توسط شمــا Position متفاوتی رو داره و زمانی که لیست شروع بــه
حرکـــت کردن مــی کنه و یـا همچنین زمانـی که در ابتدا داده هــا رو
در ListView نگاشت می کنه به اصطلاح Trigger میشه و بعد از اون
آخرین حرکت رو در خودش ذخیره می کنه. همینطور که مـی بینید و
خودتون هــم اشاره کردیـد، ایـن اتفاق به خوبـی در دو TextView به
درستی عمل می کنه.
راه حل: شما باید قبل از فراخوانی تابــع setOnClickListener مــکان
یا همون Position رو به صورت Final از Cursor دریافت کنید و سپس
در تابع setOnClickListener مـکان فعلی Cursor رو به Positionی که
قبلاً بدست اوردید انتقال بدین تا نتیجه کار به درستی نمایـــش داده
بشه. پس داخل تابع bindView باید به شکل زیر باشه :
@Override
public void bindView(View view, Context context, final Cursor cursor) {
// TODO Auto-generated method stub
TextView tv1 = (TextView)view.findViewById(R.id.txt_name);
TextView tv2 = (TextView)view.findViewById(R.id.txt_numer);
tv1.setText(cursor.getString(2));
tv2.setText(cursor.getString(3));
final Button call_btn= (Button)view.findViewById(R.id.call_btn);
final int pos = cursor.getPosition();
call_btn.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
cursor.moveToPosition(pos);
Toast.makeText(b, cursor.getString(1), Toast.LENGTH_SHORT).show();
}});
}
تابع بالا به خوبی عمل می کنه و مقدار صحیح رو برمی گردونه. فقط نکته ای که هست
شما باید و باید از ViewHolderها استفاده کنید.
موفق و پایدار باشید.
hamedjj
دوشنبه 26 اسفند 1392, 11:21 صبح
خب مشخص هست که Cursor فقط با توجه به Scroll کردن لیـــست
توسط شمــا Position متفاوتی رو داره و زمانی که لیست شروع بــه
حرکـــت کردن مــی کنه و یـا همچنین زمانـی که در ابتدا داده هــا رو
در ListView نگاشت می کنه به اصطلاح Trigger میشه و بعد از اون
آخرین حرکت رو در خودش ذخیره می کنه. همینطور که مـی بینید و
خودتون هــم اشاره کردیـد، ایـن اتفاق به خوبـی در دو TextView به
درستی عمل می کنه.
راه حل: شما باید قبل از فراخوانی تابــع setOnClickListener مــکان
یا همون Position رو به صورت Final از Cursor دریافت کنید و سپس
در تابع setOnClickListener مـکان فعلی Cursor رو به Positionی که
قبلاً بدست اوردید انتقال بدین تا نتیجه کار به درستی نمایـــش داده
بشه. پس داخل تابع bindView باید به شکل زیر باشه :
@Override
public void bindView(View view, Context context, final Cursor cursor) {
// TODO Auto-generated method stub
TextView tv1 = (TextView)view.findViewById(R.id.txt_name);
TextView tv2 = (TextView)view.findViewById(R.id.txt_numer);
tv1.setText(cursor.getString(2));
tv2.setText(cursor.getString(3));
final Button call_btn= (Button)view.findViewById(R.id.call_btn);
final int pos = cursor.getPosition();
call_btn.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
cursor.moveToPosition(pos);
Toast.makeText(b, cursor.getString(1), Toast.LENGTH_SHORT).show();
}});
}
تابع بالا به خوبی عمل می کنه و مقدار صحیح رو برمی گردونه. فقط نکته ای که هست
شما باید و باید از ViewHolderها استفاده کنید.
موفق و پایدار باشید.
داداش دمت گرم
توضیحات عالی بود
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.