انجمن سایت کلیدستان


رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل در share کردن دیتا در ListView (در برنامه نویسی اندروید)

مشکل در share کردن دیتا در ListView (در برنامه نویسی اندروید)

#1
سلام
من یه مشکل گیج کننده دارم.
من یه برنامه نوشتم که از یک دیتابیس اطلاعات رو میگیره و در هر سطر اسم همون سطر در دیتبیس رو نشون میده و با کلیک روی اون یه لینک اجرا میشه.برای این کار از list adaptor و view ها استفاده کردم به صورتی که در کلاس  list adaptor برای find viewbyid  کردن از کلمه row. هم استفاده میکنم یعنی row.findviewbyid (اینا رو گفتم که کار کلی رو بدونید).
حالا من میخواستم که وقتی کاربر روی دکمه share در هر سطر کلیک میکنه لینک اون سطر کپی و برای share کردن آماده بشه.داشتم از لینک زیر استفاده میکردم که کلید شماره 255 است.
http://www.kelidestan.com/keys/keys.php?key=255
حالا من برای استفاده از این کلید اومدم در سطر های سفارشی خودم یه عکس share تعریف کردم و id رو تغییر دادم.بعد جمله زیر را مطابق آموزش به ImageButton ای که تعریف کرده بودم در xml اش اضافه کردم.

کد پی‌اچ‌پی:
android:onClick="shareData" 

بعد به activity اصلی رفتم و بدون معرفی کردن ImageButton چون مشخصه ی onclick را تغییر داده بودم.
بعد هم اومدم تابع زیر رو در activity مطابق آموزش استفاده کردم.

کد پی‌اچ‌پی:
public void shareData(View view) {
        
Intent intent = new Intent(Intent.ACTION_SEND);
        
intent.setType("text/plain");
        
String my_string getResources().getString(R.string.my_text);
        
intent.putExtra(Intent.EXTRA_TEXTmy_string);
        
startActivity(Intent.createChooser(intent"Share this text via"));
        } 

حالا مشکل من شروع میشه.من در لیست ویو وقتی اسم رو میبینم و بعد روی اون کلیک میکنم درست نمایش میده پس میدونم تا آن جارو درست نوشتم. اما حالا اومدم برای اینکه برای share کردن به جای خط چهارم کد بالا از روش زیر استفاده کردم:
یک متغیر در بالای کل اکتیویتی قبل از onCreate و بعد از public class listview extends ListActivityتعریف کردم از جنس int.
بعد در همون قسمت list adaptorدر تابع get view که position رو داره نوشتم:

کد پی‌اچ‌پی:
id =   position+1

(+1 برای درست کردن عدده که خودم میدونم درسته نگران اشتباه بودنش نباشید. اگه اشتباه بود بعد کم و زیادش میکنم)
بعد چون متغیر id من با position +1 پر شده بود به جای جمله چهارم در کد قبلی که نوشتم (اون که برای shareData نوشتم):

کد پی‌اچ‌پی:
String my_string db.display_name_to_address(Name[id]); 

در آرایه Name من اسم هر سطر رو ذخیره کردم
با سمت راست مساوی نوشتم که وقتی کلیک شد پوزیشن را به علاوه ی یک کن و در id ذخیره کن و  بعد در آرایه اسم رو بردار و بعد برو تو دیتابیس اونی که اسمش اینه رو لینکش رو بذار اینجا.(کد های

کد پی‌اچ‌پی:
db.display_name_to_address() 

رو خودم نوشتم و میدونم درسته.
حالا چرا وقتی روی share هر سطر کلیک میکنم اینقدر بالا و پایین تر از لینک خودش نشون میده و حتی یه بار 2 تا پایین تره و بعضی وقتا 4 بالا تره رو نشون میده؟
البته من بعد از خط چهارم نوشتم که

کد پی‌اچ‌پی:
id=0

برای اینکه دو باره صفرش کنه.
اگه دقت کنید میبینید خیلی تایپ کردم و معذرت میخوام اینقدر وقتتون رو کرفتم ولی با دیدن این همه توضیح میبینید که چه قدر برای من مهمه ای مطلب.

لطفا اگه روش درسته بگید که اشکال کجاست و یا اگه اشتباهی کردم لطفا توضیح بدید تا رفعش کنم
اگه هم روش اشتباس راهنمایی کنید
من در خیلی از نرم افزار ها دیده ام که از share استفاده میکنند(در لست ویو ها)و فک نکنم اینقدر قاطی نباشه.

بیصبرانه منتظره پاسختان هستم.ممنون
پاسخ
 سپاس شده توسط admin ، mina73

مشکل در share کردن دیتا در ListView (در برنامه نویسی اندروید)

#2
سلام.
خیلی ممنون که با حوصله و واضح توضیح دادید.  

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

1- کلید زیر را تا آخر بخوانید که در آن، دو مورد برای عدم تداخل اطلاعات item های Listview با هم شرح داده شده است :

کلید شماه 2961

که در آن، نکته اول، وابسته کردن اطلاعات به position است (درون روش getView)، که البته این طور که توضیح دادید، شما آن را رعایت کرده اید و دومی هم، ساختار صحیح برای روش getView است، یعنی مشابه کد زیر :
کد پی‌اچ‌پی:
View row convertView;         
if (
row == null) {
        
LayoutInflater inflater = (LayoutInflatergetSystemService(Context.LAYOUT_INFLATER_SERVICE);
        
row inflater.inflate(R.layout.list_itemparentfalse);


2- من این راه را که در فایل xml ، برای مشخصه onClick ، یک روش (method) را تعریف کنیم، قبلا تست کرده ام :

کد پی‌اچ‌پی:
android:onClick="shareData" 

اما برای عنصرهای در حالت عادی بود، نه برای عنصرهای قرار گرفته در ردیف های (rows) موجود در ListView . نمی گویم غلط است، ولی تاکنون آن را تست نکرده ام (حالا در ادامه استدلالم را شرح می دهم). معمولا در میان کدهای روش getView ، عنصر را شناسایی می کنیم و بعد با روش setOnClickListener (کلید شماره 2728)، تعیین می کنیم که با اشاره کاربر بر روی آن عنصر، چه کدی اجرا شود و در این مراحل، کدها را هم به position وابسته می کنیم تا item ها با هم تداخل پیدا نکنند (یعنی حداقل بنده همیشه همین روش را داشته ام).
به این دلیل این مورد استفاده شده در کد شما را مشکل دار می دانم که ما برای همه item ها، روش shareData را تعیین کرده ایم. درست است که در روش shareData ، متغیر id (وابسته به position) به کار رفته، ولی این متغیر در بیرون از روش getView ، برابر id حاصل از شماره آخرین ردیفی (item ای) است که View آن در صفحه ساخته شده (نمایش داده شده)(در View آخرین ردیف ساخته شده). اینکه چه مقداری باشه، بستگی داره که آخرین ردیف ساخته شده در صفحه چی باشه، نه اینکه ما روی کدام ردیف اشاره کرده ایم. یعنی تا آنجایی که بنده می دانم، شما باید position (یا id یا هر متغیر دیگر که به آن وابسته است) را تنها در روش getView به کار ببرید.

بنابراین شما بر اساس این 2 موردی که گفتم، ابتدا مورد شماره 1 را بررسی کنید، اگر همچنان مشکل وجود داشت، بد نیست که سبک برنامه نویسی را بر اساس نکته شماره 2 که تذکر دادم، تغییر بدهید و ببینید که مشکل برطرف می شود یا خیر. نتیجه را هم تذکر بدهید تا سایر دوستان نیز از تجربه شما استفاده کنند.
قبل از تغییرات، از پروژه اندروید خود یک نسخه پشتیبان تهیه کنید.

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط mina73 ، شماره مجازی امارات


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان