armoghaddam

مشکل در دیتابیس و رویداد کلیک در RecyclerView

5 ارسال در این موضوع قرار دارد

سلام خسته نباشید 

من برای اولین بار میخوام تو یه پروژه از RecyclerView استفاده کنم 

یه مشکلی دارم که احتمالا از درک اشتباه من از ریساکلر هست ولی خب در نوع خودش چند روز دهن مارو سرویس کرده :))

ببینید ما اطلاعات رو به صورت رشته json از سرور دریافت میکنیم و اون هارو توی دیتابیس insert میکنیم 

			Dim parser As JSONParser
			parser.Initialize(job.GetString)
			Dim root As Map = parser.NextObject
			Dim data As List = root.Get("data")
			For o = 0 To data.size - 1
				Dim currentMassege() = Regex.Split(",",data.Get(o)) As String
				Dim currentMid =  currentMassege(0) As Int
				Dim currentTitle = currentMassege(1) As String
				Main.SQL1.ExecNonQuery("INSERT INTO masseges ('mid','title','isdeleted') VALUES ('"& currentMid &"','"& currentTitle &"','"& 0 &"')")
			Next

توی دیتابیس لوکال چند ستون داریم که mid و title و isDeleted هستند و mid ایدی مخصوص هر پیام هست که وقتی روی هر کدوم کلیک شد باید همون id ارسال بشه به سرور تا توضیحات تکمیلی مربوط به اون رو دریافت کنه.

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

Sub lv_onCreateViewHolder (Parent As Panel, ViewType As Int)      '💎 onCreate 💎'
	Parent.LoadLayout("formMassegeListItem")
	Dim Cursor As Cursor
	Cursor = Main.SQL1.ExecQuery("SELECT * FROM masseges WHERE isdeleted = 0")
	Cursor.Position = massegeCountRows
	Dim label As Label = PanelItem.GetView(2)
	label.Text = Cursor.GetString("title")
	Log(Cursor.GetInt("mid"))
	If massegeCountRows = Cursor.RowCount-1 Then
		massegeCountRows = 0
	Else
		massegeCountRows = massegeCountRows + 1
	End If
End Sub

چون فکر میکنم که مقدار ها همیشه ثابت هست گذاشتم تو onCreate ! حالا اگه اینم اشتباه میکنم بهم تذکر بدید :)

خب این کد به درستی کار میکنه و من همه لیست رو درست دریافت میکنم و کاااااااملا همه چیز خوب و مشتیه ولی مشکل اساسی و اصلی تو رویداد کلیک هست.

وقتی میخوایم یه ایتم از لیست کلیک کنیم باید بریم و mid مربوط به اون پیام رو از دیتابیس بخونیم و بفرستیم به سرور و همزمان دیتابیس update بشه و isDeleted برابر یه مقداری غیر از مقدار دیفالت بشه تا دفعه بعدی دیگه تو لیست نشون داده نشه

دو مشکل داریم :

  1. چطور mid رو از دیتابیس بخونیم ؟ 
  2. چطور رویداد کلیک رو بنویسیم که قاطی پاتی نشه اطلاعات ! چون اونطور که متوجه شدم ریسایکل میشه لیست و هعی مقدار ها عوض میشه

 

پیشاپیش از پاسختون ممنونم 

Untitled.png

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام ، اطلاعات مورد نیاز اصلی رو ندادید ولی اطلاعات اضافه زیادی دادید .

در 23 دقیقه قبل، armoghaddam گفته است :

Sub lv_onCreateViewHolder (Parent As Panel, ViewType As Int)      '💎 onCreate 💎'
	Parent.LoadLayout("formMassegeListItem")
	Dim Cursor As Cursor
	Cursor = Main.SQL1.ExecQuery("SELECT * FROM masseges WHERE isdeleted = 0")
	Cursor.Position = massegeCountRows
	Dim label As Label = PanelItem.GetView(2)
	label.Text = Cursor.GetString("title")
	Log(Cursor.GetInt("mid"))
	If massegeCountRows = Cursor.RowCount-1 Then
		massegeCountRows = 0
	Else
		massegeCountRows = massegeCountRows + 1
	End If
End Sub

چون فکر میکنم که مقدار ها همیشه ثابت هست گذاشتم تو onCreate ! حالا اگه اینم اشتباه میکنم بهم تذکر بدید :)

 

درسته که مقدار ها توی onCreate ثابت هستند ولی بازم به اندازه ی آیتم های قابل مشاهده در صفحه تکرار میشند . پس اینطور نیست که کدهای sql و cur رو داخلش بنویسیم
شاید جواب بده اما غیر استاندارده

اینجور موارد یا باید توی Activity_Create نوشته بشه .
یا حداقلش توی ساب های دیگه ای انجام بشه .

 

مورد دیگه اینکه نگفتید توی GetItemCount چطور دارید تعداد رو برمیگردونید .

مثالی برای رویداد کلیک

Sub LV_ItemClick (ClickedItem As Panel, Position As Int)		'👆 ItemClick 👆'
	Cur.Position = Position
	
	Dim label = ClickedItem.GetView(0) As Label
	
	label.Text = Cur.GetString("col1")
End Sub

مثال با لیست و type

Sub LV_ItemClick (ClickedItem As Panel, Position As Int)		'👆 ItemClick 👆'
	Dim item = itemList.Get(Position) As MyModel
	
	Dim label = ClickedItem.GetView(0) As Label
	
	label.Text = item.text
End Sub

 

اگه میخواید کد ارسال متن به هاست بزارید داخلشون  باید position توی کلیک رو بگیرید

توی رویداد JobDone اطلاعات رو میگیرید اگه عمومی بود که با یه notifyDataSetChanged ساده حل میشه

توی onBind اطلاعات بروز میشه.

 

اما اگه فقط همون آیتم کلیک شده رو میخواید تغییر بدید

توی jobDone یا هرجایی که دارید اطلاعات میگیرید ، با یه notifyItemChanged میتونید همون پوزیشن کلیک شده رو تغییر بدید
برای گرفتن ویو های داخل آیتم کلیک شده توی سابی بغیر از ItemClick میتونید از کد زیر استفاده کنید .

 

Dim label = LV.GetParentByPosition(10).GetView(0) As Label

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام لطفا راهنمایی کنید

Sub Activity_Create(FirstTime As Boolean)
	If File.Exists(File.DirInternal,"dbqul.db") = False Then
		File.Copy(File.DirAssets,"dbqul.db",File.DirInternal,"dbqul.db")
	End If
	Activity.Color = 0xFFFAFAFA
    LV.Initializer("lv").ListView.RTL.Build
	Activity.AddView(LV,0,0,100%x,100%y)
	LV.SpacingItemDecoration(5, True)
	LV.Show
End Sub

Sub LV_onCreateViewHolder (Parent As Panel, ViewType As Int)      '# onCreate #'
	If sql1.IsInitialized=False Then
		sql1.Initialize(File.DirInternal,"dbqul.db",False)
	End If
	cur1=sql1.ExecQuery("SELECT * FROM kafron")
	For i=0 To cur1.RowCount-1
		cur1.Position=i
		Dim p As Panel
		p.Initialize("p")
		Parent.AddView(p,0,0,100%x,100%y)
		Parent.LoadLayout("l1")
		Label1.Text=cur1.GetString("ayat") 
		Label2.Text=cur1.GetString("ta") 
		Label2.TextColor= Colors.Red
	Next
End Sub

Sub LV_onBindViewHolder (Parent As Panel, Position As Int)         '* onBind *'
	Parent.Width = -1
	Parent.Height =90dip
End Sub

Sub LV_GetItemCount As Int 
	If sql1.IsInitialized=False Then
		sql1.Initialize(File.DirInternal,"dbqul.db",False)
	End If
	cur1=sql1.ExecQuery("SELECT * FROM kafron")			       
	Return cur1.RowCount
End Sub

 

 

 

وقتی خروجی میگیرم تمامی ایتم های لیست تکراری هستن!!!

باید چکار کنم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

باسلام وتشکر از ارائه کتابخانه خوبتان

من در سورس صفحه شبیه کافه بازار برای ریسایکلر ویو افقی ، آیتمهای متن و تصویر رو از سرور ودیتابیس آنلاینم دریافت میکنم 

مشکل اینجاست که برای تک تک آیتمها اعم از تصویر یا لیبل ها به تنهایی رویداد کلیک نمی تونم تعریف کنم ، دچار باگهای متعدد میشوم ، مثلا باکلیک مسیج باکس اختصاصی ام رو باز میکنم وقتی مسیج باکس بسته میشه ریسایکلر بااسکرول شدن خطا میده، 

یعنی tag تنها بر parent اصلی جواب میده ! 

 

ولی مشکل مهمتری که الان لنگم کرده اینکه با رویداد کلیک روی پرنت اصلی ، دستور تغییر تصویر رو میدهم ، وتصویر هر آیتمی که کلیک شده رو از لینک مربوطه گرفته و تغییر میده ولی وقتی اسکرول میکنم میبینم 6 ، 7 تا آیتم بعدی ، تصاویر آیتم های دیگری هم ناخواسته به همان تصویر انتخابی تغییر کرده اند! لطفا اینو بررسی نمایید و راهنمایی بفرمایید. 

 

*مشکل رفرش هم دراین ریسایکلر ویو افقی دارم !

متشکرم

ویرایش شده در توسط sfrsfre

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در در 3/11/2018 در 00:31، sfrsfre گفته است :

باسلام وتشکر از ارائه کتابخانه خوبتان

من در سورس صفحه شبیه کافه بازار برای ریسایکلر ویو افقی ، آیتمهای متن و تصویر رو از سرور ودیتابیس آنلاینم دریافت میکنم 

مشکل اینجاست که برای تک تک آیتمها اعم از تصویر یا لیبل ها به تنهایی رویداد کلیک نمی تونم تعریف کنم ، دچار باگهای متعدد میشوم ، مثلا باکلیک روی تصویری یا لیبلی در ریسایکلرویو ، مسیج باکس اختصاصی ام رو باز میکنم وقتی مسیج باکس بسته میشه ریسایکلر بااسکرول شدن خطا میده، 

یعنی tag تنها بر parent اصلی جواب میده ! 

 

ولی مشکل مهمتری که الان لنگم کرده اینکه با رویداد کلیک روی پرنت اصلی ، دستور تغییر تصویر رو میدهم ، وتصویر هر آیتمی که کلیک شده رو از لینک مربوطه گرفته و تغییر میده ولی وقتی اسکرول میکنم میبینم 6 ، 7 تا آیتم بعدی ، تصاویر آیتم های دیگری هم ناخواسته به همان تصویر انتخابی تغییر کرده اند! لطفا اینو بررسی نمایید و راهنمایی بفرمایید. 

 

*مشکل رفرش هم دراین ریسایکلر ویو افقی دارم !

متشکرم

اینو چیکارکنم؟

ویرایش شده در توسط sfrsfre

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری