لود کردن آیتم ها با اسکرول - Lazzy Loading - حل شد
سلام
من آموزش های استاد رو درباره مارکت دیدم
و الان هیچ مشکلی ندارم جز یکی
بر فرض 1000 هزار آیتم دارم
خوب مطمئنا برنامه نمیتونه در جا همه رو لود کنی و خیلی طول میکشه
میخواستم ببینم چطوری میشه هر دفعه 10 تا آیتم لود کنه و وقتی کاربر اسکرول کرد به سمت پایین همینطوری 10 آیتم اضافه بشه
ممنون میشم راهنمایی کنید
سلام
من مشکلم حل نشد
یعنی تونستم اون تیکه رو درست کنم
ولی هر درخواستی برای مرتب سازی یا فیلتر کردن میفرستادم برنامه کرش میکرد
کلا از روشی خوبی نرفتم
تایپک اقای ALU هم رفتم ولی هیچی نتونستم بفهمم
تقریبا مشکل اون یکم با من فرق داره
من اون کد رو دارم که اگه به اخرین ایتم رسید مثلا یه کاری بکنه
ولی مشکل من اینه :
مثلا اول 10 آیتم لود کنه بعد که به اخرین ایتم رسید 10 آیتم دیگه
خواهش میکنم کمک کنید
جون هر کسی دوست دارید
کد 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) {}
}
}
}
منم همین مشکل رو داشتم. و به شیوه صفحه بندی در php حلش کردم. البته جایی نخوندم و به فکر خودم رسید اگه دوستان هم تایید می کنند از این روش استفاده کن.
در سمت php کد زیر رو برای گرفتن کوئری و نمایش ایتم ها در لیست داریم.که 5 تعدادآیتم مورد نیاز و 35 شماره شروع رکورد هست که باید بطور مداوم تغییر کنه. شما خیلی راحت این مقدار رو از طریق متد get یا post به سرور ارسال کنید و جای 35 قرار بدید. و هر بار که به انتهای لیست میرسید این مقدار رو با تعداد مد نظر جمع کنید ( num+=14) پس هر بار این مقدار جدید به سرور ارسال میشه و اطلاعات جدید دریافت میشه. فقط ترد و هندلر فراموش نشه.
mysql_query("SELECT * FROM table ORDER BY age ASC LIMIT 35,5");
چون کد تو نظر درست نیومد اینجا میزارم
$result = mysqli_query($connection, "SELECT * FROM books WHERE " . $_REQUEST['filter'] . " ORDER BY " . $_REQUEST['sort']);
با توجه به قولی که به دوستان دادم و گفتم پاسخ میدم ، دیدم هیچ چیز بهتر از یه نمونه پروژه نیست ، میتونید دانلود کنید !
شما باید یه متغیر دیگه هم برای نقطه شروع داشته باشید. همین کدی که گذاشتید باید ویرایش بشه که شکل صحیحش این میشه ، num همون متغیریه که باید در هر بار فراخوانی مقدارش افزایش پیدا کنه
$result = mysqli_query($connection, "SELECT * FROM books WHERE " . $_REQUEST['filter'] .
" ORDER BY " . $_REQUEST['sort']." LIMIT ".$_REQUEST['num'].",15");
1 - شما در هر درخواست تعداد خاصی خروجی دارید ، این میشه Limit
2 - شما در هر بار درخواست ، ممکنه قبلا یه تعدادی را دریافت کرده باشید ، ممکنه نکرده باشید ! ، پس به offset هم نیاز دارید !
شما علاوه بر سایر پارامتر هایی که نیاز دارید ، باید offset را از برنامه به سرور بفرستید کد php به این شکل میشه
$offset = $_Post['offset'];
$limit = 10;
$command = "SELECT * FROM `table` LIMIT $offset,$limit";
پس در واقع شما میگید از N تا M یا در اینجا از offset تا offset +10 رو به من برگردون !
موفق باشید
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .