بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

لود کردن آیتم ها با اسکرول - Lazzy Loading - حل شد

مدیریت گفتگو
Pr0gramm3r 12 سال پیش
آخرین تغییر: 11 سال پیش

 سلام

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

و الان هیچ مشکلی ندارم جز یکی

بر فرض 1000 هزار آیتم دارم

خوب مطمئنا برنامه نمیتونه در جا همه رو لود کنی و خیلی طول میکشه

میخواستم ببینم چطوری میشه هر دفعه 10 تا آیتم لود کنه و وقتی کاربر اسکرول کرد به سمت پایین همینطوری 10 آیتم اضافه بشه

ممنون میشم راهنمایی کنید

نظرات

Pr0gramm3r 12 سال پیش
باز کسی کمک نمیکنه ...
sadeghbarout 12 سال پیش
باز کسی سرچ نمیکنه. هنوز 3 هفته نیست alu این سوالو پرسیده و جواب داده . سوال 1602
مجتبی یگانه 12 سال پیش
باز دم صادق گرم که تکراری هم جواب میده :))
sadeghbarout 12 سال پیش
قربونت . ظاهرا باید یه تذکر جمعی بدیم. اینجور نمیشه ! ;)
Pr0gramm3r 12 سال پیش
باز من ضایع شدم :| , ولی باز نفهمیدم چظوری باید مشکلمو حل کنم , یعنی چظوری به لیست ویو بگم چقدر اول لود کنه , بعد که اومد پایین چقدر دیگه

پاسخ‌ها 7

Pr0gramm3r 12 سال پیش

سلام

من مشکلم حل نشد

یعنی تونستم اون تیکه رو درست کنم

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

کلا از روشی خوبی نرفتم

تایپک اقای ALU هم رفتم ولی هیچی نتونستم بفهمم

تقریبا مشکل اون یکم با من فرق داره

من اون کد رو دارم که اگه به اخرین ایتم رسید مثلا یه کاری بکنه

ولی مشکل من اینه : 

مثلا اول 10 آیتم لود کنه بعد که به اخرین ایتم رسید 10 آیتم دیگه

خواهش میکنم کمک کنید

جون هر کسی دوست دارید

نظرات

YouNes Sh 11 سال پیش
بچه ها این موضوع خیلی قاطی شده من متوجه نشدم چجوری شد.میشه توضیحه شسته رفته ای بدید یا یه نمونه کد بذارید ممنون میشم
Pr0gramm3r 12 سال پیش

کد BookList همون ApplicationList تو آموزش

 package pr0gram3r72.BookOnline;

import java.util.ArrayList;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;


public class BookList extends EnhancedActivity {

private ListView list;
private AdapterApplication adapter;
private ArrayList<StructApplication> applications = new ArrayList<StructApplication>();
private Button btnSortPrice;
private Button btnSortRate;
private Button btnSortInstalls;
private Button btnAll;
private Button btnFree;
private EditText ed1;
private TextView txtN;
private Button btnSearch;
private Button btnPaid;
private String lastSort = "book_ratingValue DESC";
private String lastFilter = "1=1";
public static JSONArray y;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.book_list);
list = (ListView) findViewById(R.id.list);
btnSortPrice = (Button) findViewById(R.id.btnSortPrice);
btnSortRate = (Button) findViewById(R.id.btnSortRate);
btnSortInstalls = (Button) findViewById(R.id.btnSortInstalls);
btnAll = (Button) findViewById(R.id.btnAll);
btnFree = (Button) findViewById(R.id.btnFree);
btnSearch = (Button) findViewById(R.id.button1);
ed1 = (EditText) findViewById(R.id.editText1);
btnPaid = (Button) findViewById(R.id.btnPaid);
txtN = (TextView) findViewById(R.id.txtN);

btnSearch.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
lastFilter = "book_name=" + ed1.getText();
populateFromServer();
}
});

btnSortPrice.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
lastSort = "book_price DESC";
populateFromServer();
}
});

btnSortRate.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
lastSort = "book_ratingValue DESC";
populateFromServer();
}
});

btnSortInstalls.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
lastSort = "book_install DESC";
populateFromServer();
}
});

btnAll.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
lastFilter = "1=1";
populateFromServer();
}
});

btnFree.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
lastFilter = "book_price=0";
populateFromServer();
}
});

btnPaid.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
lastFilter = "book_price>0";
populateFromServer();
}
});
adapter = new AdapterApplication(applications);
list.setAdapter(adapter);
list.setOnScrollListener(new OnScrollListener() {

private int currentVisibleItemCount;
private int currentFirstVisibleItem;
private int currentScrollState;


@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
this.currentFirstVisibleItem = firstVisibleItem;
this.currentVisibleItemCount = visibleItemCount;
}


public void onScrollStateChanged(AbsListView view, int scrollState) {
this.currentScrollState = scrollState;
this.isScrollCompleted();
}


private void isScrollCompleted() {
if (this.currentVisibleItemCount > 0 && this.currentScrollState == SCROLL_STATE_IDLE) {
boolean isLoading = false;
if ( !isLoading) {
isLoading = true;
loadMoreData();
}
}

}


private void loadMoreData() {
// TODO Auto-generated method stub
// populateFromServer();
}
});
populateFromServer();
}


private void populateFromServer() {
String url = "http://192.168.1.101/bookm/service.php";
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("action", "read"));
params.add(new BasicNameValuePair("filter", lastFilter));
params.add(new BasicNameValuePair("sort", lastSort));

String result = Webservice.readUrl(url, params);
if (result.contains("[]")) {
list.setVisibility(View.GONE);
txtN.setVisibility(View.VISIBLE);
} else {
list.setVisibility(View.VISIBLE);
txtN.setVisibility(View.GONE);
}
if (result != null) {
try {
applications.clear();
JSONArray books = new JSONArray(result);
y = books;
for (int i = 0; i < books.length(); i++) {
JSONObject object = books.getJSONObject(i);
StructApplication application = new StructApplication();
application.file = object.getString("book_file");
application.name = object.getString("book_name");
application.price = object.getInt("book_price");
application.ratingValue = (float) object.getDouble("book_ratingValue");
application.logoUrl = object.getString("book_logoUrl");
application.author = object.getString("book_author");
application.description = object.getString("book_description");
application.filesize = object.getInt("book_size");
application.installs = object.getInt("book_install");
application.votes = object.getInt("book_votes");

applications.add(application);
}

adapter.notifyDataSetChanged();
}
catch (JSONException e) {}
}
}
}

نظرات

EloMan 12 سال پیش

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

در سمت php  کد زیر  رو برای گرفتن کوئری  و نمایش ایتم ها در لیست داریم.که 5 تعدادآیتم مورد نیاز و 35 شماره شروع رکورد هست که باید بطور مداوم تغییر کنه. شما خیلی راحت این مقدار رو از طریق متد get یا post به سرور ارسال کنید و جای 35 قرار بدید. و هر بار که به انتهای لیست میرسید این مقدار رو با تعداد مد نظر جمع کنید ( num+=14)  پس هر بار این مقدار جدید به سرور ارسال میشه و اطلاعات جدید دریافت میشه. فقط ترد و هندلر فراموش نشه.

  mysql_query("SELECT * FROM table ORDER BY age ASC LIMIT 35,5");

نظرات

Pr0gramm3r 12 سال پیش
میشه بیشتر توضیح بدید , کد رو دقیقا کجا بزارم؟ این کد اونجا دارم $result = mysqli_query($connection, "SELECT * FROM books WHERE " . $_REQUEST['filter'] . " ORDER BY " . $_REQUEST['sort']); باید بعد این یا به جای این بزارم؟
Pr0gramm3r 12 سال پیش

چون کد تو نظر درست نیومد اینجا میزارم

 $result = mysqli_query($connection, "SELECT * FROM books WHERE " . $_REQUEST['filter'] . " ORDER BY " . $_REQUEST['sort']);

 

نظرات

مجتبی یگانه 12 سال پیش

با توجه به قولی که به دوستان دادم و گفتم پاسخ میدم ، دیدم هیچ چیز بهتر از یه نمونه پروژه نیست ، میتونید دانلود کنید !

لینک دانلود مستقیم

نظرات

Pr0gramm3r 12 سال پیش
اقا خیلی ممنون بابت پروژه ولی این به صورت افلاینه , اینو کامل بلدم , مشکلم تو آنلاینه .. نمیتونم بر فرض 100 تا table درست کنم مثلا اول table 1 رو لود کنه و بعد که به آخر رسید table 2 و ... من میخوام مثلا 10 آیتم اول table رو لود کنه و وقتی به آخر رسید 10 آیتم بعدیش رو ..
مجتبی یگانه 12 سال پیش
با این تفاسیر ، پاسخ دوستان کاملا درسته ، اما من هم  پاسخ میدم
Borhani 12 سال پیش
تشکر از راهنمایی
EloMan 12 سال پیش

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

  $result = mysqli_query($connection, "SELECT * FROM books WHERE " . $_REQUEST['filter'] .
" ORDER BY " . $_REQUEST['sort']." LIMIT ".$_REQUEST['num'].",15");

نظرات

Pr0gramm3r 12 سال پیش
خیلی ممنون داداش , سعی میکنم با این مشکلمو حل کنم
Pr0gramm3r 12 سال پیش
من هنوز دقیقا این num رو نفهمیدم , ولی این 15 تعداد آیتمیه که باید نشون بده درسته؟ پس num چیه
EloMan 12 سال پیش
این num همون شماره ایه که بعد از اون اطلاعات به میزان 15 رکورد لود میشه.اولش صفره و 15 آیتم اول توسط json خونده میشه . وقتی که به آخر لیست رسیدی که تو کد دوستان توضیح دادن چجوری میشه فهمید به انتهای لیست (که همون 15 آیتمه) رسیدیم num+=15 میشه و به سرور ارسال میشه. دستور دوباره فراخوانی میشه اما اینبار از 15 تا 30 و به همین ترتیب.مفهمومه؟ فقط یادت باشه این دستورات توی ترد باشه و آخر سر هم بعد از اتمام کار ترد (باید مطمئن بشی کار ترد تموم شده و اطلاعات لود شده.) notifydatasetchange رو توی یه هندلر فراخوانی کنی.
h_uk2009 11 سال پیش
آقای EloMan میشه کامل بنویسی کد مربوطه رو ؟؟؟؟؟؟
مجتبی یگانه 12 سال پیش

1 - شما در هر درخواست تعداد خاصی خروجی دارید ، این میشه Limit
2 - شما در هر بار درخواست ، ممکنه قبلا یه تعدادی را دریافت کرده باشید ، ممکنه نکرده باشید ! ، پس به offset هم نیاز دارید !

شما علاوه بر سایر پارامتر هایی که نیاز دارید ، باید offset را از برنامه به سرور بفرستید کد php به این شکل میشه

$offset = $_Post['offset'];
$limit = 10;
$command = "SELECT * FROM `table` LIMIT $offset,$limit";

پس در واقع شما میگید  از N تا M یا در اینجا از offset تا offset +10 رو به من برگردون !

موفق باشید

نظرات

Pr0gramm3r 12 سال پیش
اخه برادر من , الان انتظار داری با این عقلم اینو درک کنم؟ :D
Pr0gramm3r 12 سال پیش
یه بار دیگه خوندم عقلم کشید , خیلی ممنون , نیازی به توضیح نیست
مجتبی یگانه 12 سال پیش
اگه توضیح میخواستی ، منم آدرس میخواستم ، بعد بحث جذاب ترمیشد ، یه چیزی تو مایه های کشتی کج D:
hosseinAmini 12 سال پیش
مرسی از توضیح خوبت. شما منظوزتون اینه که هربار لیست به انتها رسید از سمت اندروید تعداد آیتم های لود شده رو به سرور بفرستیم و این تعداد در متغیره offset ذخیره بشه؟ حالا سوالم اینه که چجوری متوجه شیم که لیست به انتها رسیده؟
مجتبی یگانه 12 سال پیش
تازه رسیدید به جایی که برای من خیلی درد سر داشت ! ، اما الان حل شد ، یه شرط سه مقداری هست ، سوالات من رو برسی کنید میبینیدش !
hosseinAmini 12 سال پیش
منظورت این سواله ؟http://answers.uncocoder.com/question/1602/بازگذاری-داینامیک-آیتم-ها-در-لیست-ویو-nbsp-حل-شد- این پروژه ای که تو همین تاپبک گذاشتید چی؟ دقیقا متوجه نمی شم تو تاپیکی که لینکش رو دادم یه روش گفتید تو پروژه ای هم که گذاشتید از یه روش دیگه استفاده کردید.
مجتبی یگانه 12 سال پیش
عملکرد هر دو یکی هست ، یعنی برسی میشه آیا ایتمی که در حال fill شدن هست آیتم آخره یا نه ! - لطفا سوالاتتون رو در همون تاپیک بپرسید

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