آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

آموزش استفاده از lazy loading listView (کامل)

کاشی زاده  9 سال پیش  6 سال پیش
+102 0

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

اول از همه شما باید بدونید که برای ایجاد lazy listView ما نیاز داریم تا هم سرور و هم کلاینت رو طوری براش کد بنویسیم که کاملا داینامیک عمل کنه.

ابتدا از سمت سرور شروع میکنیم و نحوه پاسخ دادن سرور روبه کلاینت بهتون نشون میدم .

همه ریکوست هایی که برای پر کردن لیست ویو استفاده میکنید باید به شکل زیر باشه :

  $part = $_GET['part'];
$start = $part * 10;
SELECT * FROM MyTable LIMIT start, 10;

خُب ، حالا part$ و start$ چیه ؟

همونطور که از اسمشون مشخصه part$ برابر قسمت نمایشی هست و start$ برای مدیریت نمایش آیتم هاست که شما در کلاینت با ارسال مقدار part$ تعیین میکنید که چندمین قسمت از لیست رو میخواید بگیرید ، عدد 10 نیز یعنی ما در هر درخواست فقط 10 آیتم رو نیاز داریم تا به کاربر نشون بدیم.

دیگه با سرور کاری نداریم و میریم سراغ کلاینت . در کلاینت شما برای اینکه بتونید از این سیستم استفاده کنید ابتدا باید آخرین وضعیت آیتم هارو ببینید .

با استفاده از کد زیر آخرین آیتمی که کاربر مشاهده میکنه رو شما میگیرید .

 listView.setOnScrollListener(new OnScrollListener() {

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                int lastItem = firstVisibleItem + visibleItemCount;
		if (adapter.getCount() >= 10 && lastItem  > adapter.getCount() - 3) {
			boolean isLoading = false;
			if (!isLoading) {
				if(readNetworkStatus(context)){
					if(lastItem > lastItemPosition){
						lastItemPosition = adapter.getCount();
						receivedData();
						}
					}
			isLoading = true;
				}
			}
		}
			public void onScrollStateChanged(AbsListView view, int scrollState) {}

	});

کد بالا شاید برای دوستانی که آشنا نیستن یکم وحشتناک باشه ولی من براتون قسمت های ختلف کد رو به صورت کامل توضیح میدم .

کاملا مشخص هست که ما یک لیست ویو داریم و براش یک لیسنر از نوع OnScrollListener تعریف میکنیم که برای ما چند 2 متد رو میاره که یکیش onScrollStateChanged که برای نمایش وضعیت اسکرول کردن هست که باهاش کاری نداریم و یکی دیگه onScroll هست که ما با اون سرو کار داریم .

داخل متد onScroll شما یه سری کد میبینید که نوشتم که به ترتیب توضیح میدم :

 int lastItem = firstVisibleItem + visibleItemCount;

این قسمت از کد دقیقا آخرین آیتمی که کاربر مشاهده کرده رو به ما موقعیتش رو میده .

 if (adapter.getCount() >= 10 && lastItem  > adapter.getCount() - 3)

این کد مربوط به بررسی وضعیت آیتم ها هست که اگر شرط برقرار باشه میتونه درخواست جدید رو به سرور بفرسته 

 adapter.getCount() >= 10

ینی اگر تعداد آیتم های دریافت شده بزرگتر و مساوی 10 بود که همونطور که گفتیم این 10 هم همون 10 هست که داخل سرور وجود داشت .

 lastItem  > adapter.getCount() - 3

این کد هم به این معنی هست که اگر آخرین آیتمی که کاربر داره میبینه بزرگ تر از تعداد کل آیتم های موجود -3 بود شرط برقرار باشه .

نکته ای که هست -3 برای این هست که کاربر قبل از اینکه به آخر لیست برسه یعنی سومین آیتم از آخر رو که دید لیست جدید رو بگیره که کاربر معطل نشه .

 boolean isLoading = false;

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

 if(readNetworkStatus(context))

این کد هم که تقریبا باهاش آشنایی دارید برای این هست که اگر اینترنت وصل هست لیست جدید رو بگیره .

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

 if(lastItem > lastItemPosition){

خُب از این کد هم فقط lastItemPosition  نا مفهمومه که توضیح میدم این یه متغیر عددی هست که ما آخرین آیتمی که دیده شده رو ذخیره میکنیم این درواقع شاید بگید به چه دردی میخوره ما اون بالا داریمش که ، این در حالت عادی 0 هست و بعد از دریافت هر بار لیست جدید مقدارش تغیر میکنه ببینید شما در lastItem  آخرین آیتمی که کاربر دیده رو میتونید ذخیره کنید ولی اگر کاربر دوباره برگرده بالا و بیاد پایین مجددا لیس ت میخواد آپدیت بشه و با استفاده از این متغیر ما جلو این کار رو میگیریم .

شاید یکم گنگ باشه برای اینکه متوجه بشید میتونید از این کد استفاده نکنید تا باگش رو خودتون ببینید  :)

 lastItemPosition = adapter.getCount();
 receivedData();
						}
					}
			isLoading = true;

در آخر هم مقدار آخرین آیتم مشاهده شده رو برابر تعداد کل آیتم ها میکنیم (همون داستان باگه) و در receivedData درخواست دریافت اطلاعات جدید رو میدیم و پایین تر هم میگیم داریم لیست رو لود میکنیم .

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

فقط یک نکته اساسی میمونه شما باید part رو برای سرور بفرستید برای اینکار باید یه متغیر از جنس عدد بسازید که اولین بار مقدارش 0 هست و هر بار که ما درخواست به سرور میزنیم اینم براش میفرستیم و زمانی که لیست جدید دریافت شد یدونه به part اضافی میکنیم که این کار برای گرفتن قسمت بعدی لیست انجام میشه.

امیدوارم بتونید از این آموزش بهره کامل رو ببرید .

 

موفق باشید :)

0 0
دو تا نکته محمد حسین جان ! شما که نوشتی چرا کامل ننوشتی ای دوست گل ... مثلا part رو ننوشتی ولی کرفتم چی شد ولی lastItemPosition رو نفهمیدم گجا مقدارشو تعیین میکنیم یا کردی !؟؟؟؟؟؟؟؟؟؟؟؟ (9 سال پیش)
0 0
این کد وقتی لیست ویو یک هدر داشته باشه درست جواب نمیده (9 سال پیش)
+1 0
بله اگر از هدر استفاده میکنید باید تعداد آیتم های موجد رو پیدا کنید ، دیگه من یه مثال زدم بقیش پایه خودتون هست (9 سال پیش)
0 0
محمد حسین جان، اگه یه مثال هم بزنی ممنون میشم. خدا وکیلی مــُـردم از بس تست زدم :( (9 سال پیش)
0 0
lastItemPosition رو چطور باید به دست بیاریم ؟ از چه جنسی هست ؟ این رو بگی ممنون میشم عزیز (8 سال پیش)
0 0
از نوع Int هست و موقعیت آخرین آیتمی که در صفحه نمایش داده شده رو ذخیره میکنید داخلش (8 سال پیش)
0 0
محمد حسین جان کد بالا برام کار میکنه ولی یه مشکلی داره، فقط دفعه اول که اسکرول میکنم کد به درستی کار میکنه، بعد از اون کار نمیکنه چون شرط lastItem > lastItemPosition برقرار نمیشه، میدونی مشکل میتونه از کجا باشه ؟ (8 سال پیش)
0 0
بهترین کار برای پیدا کردن باگ استفاده از LOG هست که قبل هر شرط و یا دستور اجرایی باید قرار بدید و مقادیر ارسال و دریافتی را بررسی کنید . (8 سال پیش)
 برای این سوال 8 پاسخ وجود دارد.
پاسخ به سوال 
کاشی زاده  9 سال پیش
+8 0

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

 

 int pos = position - listView.getHeaderViewsCount();


0 0
(9 سال پیش)
پاسخ به سوال 
h_uk2009  9 سال پیش
0 0

سلام من این کد رو زدم ولی وقتی اسکرول میکنم مقدار part هر بار زیاد و زیادتر میشه ! به طوری که لیستمو یک کوچولو هم که اسکرول میکنم این تابع جواب نمیده : کد رو میزارم ببین محمد حسین جان :

لازم به ذکره که اون showloadingDialog() یک تابعی که داخلش از یک متغیر async برای انحانم عملیات ارسال به سرور استفاده شده است ... نود درصد راهو رفتم ! ده درصد دیگه رو کمک کننن همه به خصوص محمد عزیز مرصی

1- اگه کسی اسکرول رو بده بالا جی !؟ این تابع فقط به part اضافه میکنه و تکه های قبلی رو از دیتابیس نمیخونه که !

2- من تا میام اسکرول کنم یک کوچولو که اسکرول میکنم میپره مقدار بعدی رو لود میکنه ! اصلا نمیزاره من برسم ... لازم به ذکره که من الیست ویوم وزنش رو 1 قرار دادم از نظر ارتفاع چون زیرش یک imageview خورده ... چکا کنممممممممممم خدااااااااا

         lstContent.setOnScrollListener(new OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) {

}


@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int lastItemPosition = 0;
int lastItem = firstVisibleItem + visibleItemCount;
if (G.adapter.getCount() >= 10 && lastItem > G.adapter.getCount() - 3) {
boolean isLoading = false;
if ( !isLoading) {
if (lastItem > lastItemPosition) {
lastItemPosition = G.adapter.getCount();
Log.i(G.LOG_TAG, "hooooooooooooo");
showLoadingDialog();
//execute((Void[]) null);
}
isLoading = true;
}
}
}
});

اینم کدعای ارسال به سرور :

 
private void showLoadingDialog() {
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {

ProgressDialog dialog = new ProgressDialog(ActivityMain.this);


@Override
protected void onPreExecute() {
super.onPreExecute();
// lstContent = (ListView) findViewById(R.id.LstContent);
// G.adapter = new AdapterNote(G.notes);
// lstContent.setAdapter(G.adapter);
//lstContent.setOnScrollListener(new OnScrollListener

dialog.setMessage("درحال بارگزاری");
dialog.show();
}


@Override
protected Void doInBackground(Void... arg0) {
// if (G.notes.size() < 1) {
params.add(new BasicNameValuePair("part", "" + part));
params.add(new BasicNameValuePair("user_id", G.cellcode));
Commands.read(params, prgListener);
// }
return null;
}


@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);

if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
if (G.getJsonString != null) {
try {

G.notes.clear();
JSONArray jsonnews = new JSONArray(G.getJsonString);
for (int j = 0; j < jsonnews.length(); j++) {
JSONObject object = jsonnews.getJSONObject(j);
StructNews note = new StructNews();
note.id = object.getInt("news_id");
note.pagenumber = object.getInt("page_number");
note.Title = object.getString("news_title");
note.description = object.getString("news_desc");
note.isfav = object.getInt("is_fav");
Log.i(G.LOG_TAG, "sss " + object.getString("news_title"));

G.notes.add(note);
}
G.adapter.notifyDataSetChanged();
part += 1;
Log.i(G.LOG_TAG, "part : " + part);

}
catch (JSONException e) {
e.printStackTrace();
}
}

}
};
task.execute((Void) null);

}

 

پاسخ به سوال 
احمد اسدی  9 سال پیش
+1 0

با تشکر از زحمات دوست عزیزمون محمد حسین جان :)

اگر دوستانی مثله من داخل لیست ویو  از Header یا Footer استفاده میکنن، همینطور که محمد حسین اشاره کردن باید موقعیت (Postion) هدر و فوتر رو از مقدار کل موقعیت ها رو کم کنید.

و همچنین میشه با در نظر گرفتن مقدار کل آیتم ها، این مشکل رو برطرف کرد.

برای پیاده سازی این سیستم، به این شکل عمل میکنیم:

 //مقادیر های اولیه رو تعریف میکنیم
private int visibleThreshold = 5; //که قراره هر صفحه 5 آیتم داشته باشیم private int currentPage = 0; private int previousTotal = 0; private boolean loading = true;

 و سپس در رویداد setOnScrollListener قرار میدهیم:

 listView.setOnScrollListener(new OnScrollListener() {
	
	@Override
	public void onScrollStateChanged(AbsListView arg0, int arg1) {}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		if (loading) {
			if (totalItemCount > previousTotal) {
				loading = false;
				previousTotal = totalItemCount;
				currentPage++;
			}
		}
		if (!loading &amp;&amp; (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {			
			new RunMyNewTask().execute(currentPage + 1); //که با هر بار اجرا، مقدار صفحه فعلی یکی اضافه میشه
			loading = true;
		}
	}
});

اومیدوارم مفید واقع بشه :)

 

0 0
سلام احمد جون ولی مشکل من اینه که اسکرول زمانی هم که فقط پایین میکشیمش لود میکنه وقتی بالا مییخوای بکشییش دیگه مقادیر قبلی رو ست نمیکنه مشکل متغیر part زو چجور حل کردی !؟ فقط اضافه میشه اکه کسی بخواد بره بالا جی ؟!!!!!!!!!!! (9 سال پیش)
0 0
من فکر میکنم مشکل شما از جای دیگس، مثلآ adapter.notifyDataSetChanged(); رو در جای مناسب نزاشتین. ولی اگه از همین کدی که قرار دادم دارید استفاده میکنید، نباید مشکلی در رویداد اسکرول داشته باشید. (9 سال پیش)
0 0
من فکر میکنم مشکل شما از جای دیگس، مثلآ adapter.notifyDataSetChanged(); رو در جای مناسب نزاشتین. ولی اگه از همین کدی که قرار دادم دارید استفاده میکنید، نباید مشکلی در رویداد اسکرول داشته باشید. (9 سال پیش)
0 0
اقا من از کد شما استفاده کردم اما مشکل اینجاست بدون اینکه من اسکرول کنم کد شما اجرا میشه ! نمیدونم چه کنم :( (9 سال پیش)
0 0
&& این چی هستش دوست عزیز ؟ (8 سال پیش)
پاسخ به سوال 
h_uk2009  9 سال پیش
+1 0

احمد جان اسدی من این کدی که شما دادی رو نوشتم به این صورت ولی در رویداد اسکرول اتفاقی نمیفته هرجی بالا پایینش میکنم لود نمیکنه پارت دوم رو از سرور یکبار نگاه کنین به کدم لطفا part همون بازه ای که از دیتا رو از سرور میخونم و jsondownloader هم که دانلود کننده با استفاده از سیستم asynce هستش

  lstContent.setOnScrollListener(new OnScrollListener() {

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
part++;

}
}
if ( !loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
new JsonDownloader().execute();
loading = true;
}
}

0 0
شما کدوم کد رو استفاده کردید؟ (9 سال پیش)
+1 0
خوب، مشکلش چیه ؟ درسته که 2 بار لود میشه اطلاعات و 2 سری اطلاعات رو میگیره (9 سال پیش)
0 0
مشگل اینه که وقتی شم روی تبلت لود کنی اطلاعاتو میگی ای سرور ده تا بفرست درسته > وقتی ده تا رو نمایش داد، بعد مسله اینه که شما میگی چک کن صفحه سه تا به آخر داره یا نه ... اما زمانی که روی تبلت هسی وقتی ده تا رو پر کرد و هنوز هم فضا برای پرکردن لیست ویو هست نمیاد به اوت دذه تا اضافه کنه بلکه میاد ده تای دوم رو پر میکنه ! و مسله بعدی اینه که زمانی که بالا بکشیم اسکرول رو اصلا مقادیر قبلی رو لود نمیکنه ! و فقط اکه توجه کرده باشی تو داری part رو اضافه میکنی ... به نظر من باید کل طول لیست ویو رو بگیری که داینامیک باشه و بعد تقسیم به تعداد ویو هایی که توی لیست هست قرار بدی ... و این به نظر من نیاز به برنامه نویسی بهتری داره اینطور فک نمیکنی محمد حسین ؟ (9 سال پیش)
+2 0
خب، اینکه لیست دوم رو صدا یزنه طبیعی هست ولی برای اینکه بخواید خیلی داینامیک کار کنه یکم وقت گیر هست و باید هم اندروید رو خوب درک کنید و هم php رو (9 سال پیش)
0 0
محمد حسین عزیز خوب تو نوشتی قربونت برم لیزی لود کامل !‌ ولی بازم دست درست خیلی چیز از همین بست یاد گرفتم .. ممنون (9 سال پیش)
+1 0
دوست عزیز آموزش کامل هست و شما میتونید ازش استفاده کنید ، ولی اگر امکانات بیشتری میخواید باید یکم خودتون تلاش کنید . منم متاسفانه فرصت ندارم بخوام براتون کد رو بنویسم (9 سال پیش)
0 0
آموزش اصلا هم کامل نیست ... تو این سایت همه خصیصن (9 سال پیش)
0 0
دارید کم لطفی می فرمایید ، البته من کدها رو کمی تغییر دادم و به نتیجخ دلخواه رسیدم چک کن ببین توی مرورگر هم می تونی از وب سرویست استفاده کنی ؟ یا این که با دیتابیس loca به نتیجه می رسی؟ (9 سال پیش)
0 0
دارید کم لطفی می فرمایید ، البته من کدها رو کمی تغییر دادم و به نتیجخ دلخواه رسیدم چک کن ببین توی مرورگر هم می تونی از وب سرویست استفاده کنی ؟ یا این که با دیتابیس loca به نتیجه می رسی؟ (9 سال پیش)
+3 0
دوست گرامی ، کسی وظیفه پاسخ گویی به سوالات رو نداره اگرم دوستان لطف میکنن و کدی رو قرار میدن به خاطر این هست که دوست دارن تجربه هاشون رو در اختیار بقیه قرار بدند ولی قرار نیست پروژه آماده رو در اختیار کسی بذارند . شما زحمت جستجو کردن رو به خودتون نمیخواید بدید و دوست دارید همه چیز آماده در اختیارتون قرار بگیره که اینجا از این خبرا نیست . (9 سال پیش)
0 0
بله از شما و افراد خصیصی مثل شما بیشتر از این انتظاری نیست .. (9 سال پیش)
+1 0
خود شما آقای حسین کرد پروزه کامل من رو برات ارسال کردم با سورس کامل قرار بودیک روزی جواب بدی کجا رفتین ؟ چرا حرف از کم لطفی میزنین .. من از همین فردا سورس همه پروزه هامو میزارم توی این سایت ولی کیه که الان بیاد جواب منو بده (9 سال پیش)
+6 0
جناب h_uk2009 لطفاً حرمت انجمن رو حفظ کنید، اگر این انجمن برای شما مفید نیست، وارد آن نشوید و نظم آن را نیز بهم نریزید، جو سازی هم نکنید لطفاً. (9 سال پیش)
0 0
گفتم که ، وقت نکردم . آقای حسینزاده در این مودیه پست زده بود ، پیدات کردم می دم بخونید ، من از شما پول نگرفتم که عضو این سایت بشین پس مسئولیتی هم ندارم . پاسخی که به هر کسی داده می شه یک لطف در حق اون شخص هست (9 سال پیش)
0 0
سوالاتی که من از مهندس حسین زاده پرسیدم ده برابر سوالات شما بود اما همیشه می دونستم که پاسخ های ایشون و سایر دوستان لطف هست و بزرگواری شون رو می رسونه و اگر پاسخی داده نشه هیچ معنی منفی از جانب اونها نداره هر کسی ممکنه پاشو از حد خودش فراتو بذاره ما خوبه کگه حد خودمون رو بدونیم (9 سال پیش)
0 0
آقای آقا جانی این که دوسنان همچین کامنتی می ذارن نشونه قدرتمند بودن پرسش و پاسخه که همه ما به اون عادت کردیم از جمله خود من به دل نگیرید (9 سال پیش)
0 0
ماشالا اینجا دیکتاتوریه کامله نمیشه انتقاد کرد !‌ یکی هم بیاد طرف ما چند نفر به یک نفر .. شما که پول نگرفتی بیخود کردی سورس پروزه من رو گرفتی از من و بعد معلوم نشد کجا رفتی .. مرد حرف میزنه بایدم رو حرفش با یسته یا بکه حداقل نتونستم نه اینکه بره خبریش نباشخه (9 سال پیش)
+1 0
آقای حسین کرد شما لازم نیست از جانب آقای آقاجانی عذر خواهی کنی و به دل نگیری اگه خیلی انسان درستی هستی روی حرفت باش .. لازم نیست شهادت واسه کسی بدی ... تو این سایت ماشالا شهادت دهنده زیاد داریم شما لازم نیست این کارو بکنی (9 سال پیش)
+5 0
جناب h_uk2009 بکار بردن واژه هایی مثل «افراد خصیص» و لحن نوشتار شما، با انتقاد زمین تا آسمون فرقشه. به هر چیزی که توهین آمیز باشه نمی گن انتقاد. نکته دوم اینکه مسئول حفظ سورس خود شما هستید و اگر احساس می کنید شخصی واجد شرایط نبوده و سورس خود را به ایشان ارائه کرده اید، باید عیب را از خود بدانید، پذیرفتن اشتباه، شهامته. بعد از اون می تونید در مورد اشتباهات دیگران قضاوت کنید، اونهم نه بصورت پاسخ در زیر پست های این انجمن، بلکه کاملاً خصوصی. (9 سال پیش)
+1 0
سلام فرمایشتون درسته استاد من این پستو ادامه نمیدم .. (9 سال پیش)
+1 0
واژه بیخودکردی رو می ذارم پای بچگیت ، یکم آجیا تقویتی بخور یادت بیاد گفته بودم وقت نکردم . دلیلی نمی بینم بحث رو با شما ادامه بدم (9 سال پیش)
+2 0
واقعا مایه تاسفه که در یک جای فرهنگی، از همچین کلماتی استفاده بشه، حسین جان بهتر بود جواب نمیدادید. امیدوارم اساتید و مدیران سایت بررسی و برخورد کنن.ممنون (9 سال پیش)
0 0
به خاطر اینکه جو اینجا بد نشه و به احترام نه فقط استاد بلکه همه دوستان لازم میدونم جوابیه ای به این حرف شما ندم . (9 سال پیش)
+2 0
نوشته های نامرتبط با سئوال توسط خودم اسپم شدند و لطفاً هیچ کدام از کاربران آنرا ادامه ندهند. با تشکر. (9 سال پیش)
0 0
حسین جان بهتر نبود isloading رو پس از نتیجه گیری از متد callwebservice تغییر بدی؟ من اینجوری استفاده کردم ، load بیش از حد نیاز نداره (9 سال پیش)
+2 0
چرا اونطوری بهتر میشه و توی تست شما خودتون میتونید بهینه تر کنید در کل جای کار زیاد داره میتونید خیلی امکانات هم بهش اضافه کنید . (9 سال پیش)
پاسخ به سوال 
Criss  8 سال پیش
+7 0

سلام دوستان

اگر برای اولین قراره این رو تست کنید پیشنهاد میکنم برای فهمیدن قضیه کد های زیر رو تست گنید < به راحتی میتونید لیست ویو رو هر موقع که نیاز داشتید آپدیت کنید <

لینک پروژه

         lstContent.setOnScrollListener(new OnScrollListener() {

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
Log.i("firstVisibleItem", "" + firstVisibleItem);
Log.i("visibleItemCount", "" + visibleItemCount);
Log.i("totalItemCount", "" + totalItemCount);
int lastItem = firstVisibleItem + visibleItemCount;
if (lastItem > adapter.getCount() - 5) {
Log.e("LOG", "Need Update");
for (int i = 0; i < 5; i++) {
StructTask task = new StructTask();
task.desc = G.tasks.get(i).desc + i; //random data
G.tasks.add(task);
adapter = new AdapterNote(G.tasks);
lstContent.setAdapter(adapter);
lstContent.setSelection(firstVisibleItem + 1); // میتونید + 1 رو بردارید
}
Log.e("LOG", "New Data");
Toast.makeText(getApplicationContext(), "New Data", 250).show();
}
}


@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) {
//Log.i("Header", "" + lstContent.getHeaderViewsCount());
//Log.i("adapter.Count", "" + adapter.getCount());
}
});

 

 

پاسخ به سوال 
parand  8 سال پیش
+1 0

سلام و با سپاس بابت آموزشی که قرار دادید

ولی ایکاش یک فیلم آموزشی در این زمینه تهیه میکردید و در اختیار اعضا قرار میدادید

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

با سپاس

پاسخ به سوال 
QUQU  7 سال پیش
0 0

این آموزش برای RecyclerView هم میتونه مورد استفاده قرار بگیره؟

پاسخ به سوال 
A.hesami  6 سال پیش
0 0

سلام ببخشید یه سوال داشتم درمورد این آموزش

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

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

هم بحث PAGING  (که خودم کدهاشو رو نوشتم برای فراخوانی از سرور )

هم استفاده از ASYNKTASK برای عدم کند شدن برنامه در حین گرفتن اطلاعات از سرور


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .