PDA

View Full Version : مشکل در Endless listview



bahram32
سه شنبه 22 دی 1394, 17:02 عصر
سلام دوستان

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

مشکل اینجاست که تعداد رکورد ها خیلی بالاست مثلا چند هزار تا است می خواهیم به این صورت باشد که 100 تا را نمایش بدهد در listview و وقتی اسکرول آمد پایین 100 تای بعدی را نمایش بدهد
از طرف api سرور به صورتی طراحی کردیم که وقتی آخر دارس json برای مثال page=2 بود 100 تای بعدی رو نمایش میده و همینطور ادامه میده

از طرف اندروید که page=1 را اول نمایش میدهیم وقتی اسکرول امد پایین میایم یکی به page اضافه میکنیم و مجدد کدهای فراخانی json را اجرا میکنید اما با این کار کل لیست ویوو از اول لود میشه و 100 تای قبلی حذف میشه و 100 تای بعدی نمایش داده میشه و همچنین اسکرول میره بالا انگار صفحه رفرش شده باشه اما تفاوتش اینه که page2 رو اورده
میخواهم وقتی اسکرول آمد پایین در همون حالت بیاد 100 تای بعدی که در page2 هست رو بیاره و همینطور ادامه بده

کد جسون بنده


pDialog.dismiss();
try {

matlab = json.getJSONArray(json_name);
// build String
json_length = matlab.length();
json_string_1_all = new String [matlab.length()];
json_string_2_all = new String [matlab.length()];
json_string_3_all = new String [matlab.length()];
json_string_4_all = new String [matlab.length()];
for(int i = 0; i < matlab.length(); i++){
JSONObject c = matlab.getJSONObject(i);
// Storing JSON item in a Variable --> with UTF-8 for persian words
json_string_1_all[i] = new String(c.getString(json_node_name_1).getBytes("UTF-8"), "UTF-8");
json_string_2_all[i] = new String(c.getString(json_node_name_2).getBytes("UTF-8"), "UTF-8");
json_string_3_all[i] = new String(c.getString(json_node_name_3).getBytes("UTF-8"), "UTF-8");
json_string_4_all[i] = new String(c.getString(json_node_name_4).getBytes("UTF-8"), "UTF-8");
}

// show data in ListView
listmatlab.setAdapter(new MyAdapter(matlab.this,
R.layout.list_layout,
R.id.vdate,
json_string_1_all));
// lv = getListView();
} catch (JSONException e) {
e.printStackTrace();

} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();



و کد اسکرول


public class EndlessScrollListener implements OnScrollListener {

private int visibleThreshold = 5;
private int currentPage = 0;
private int previousTotal = 0;
private boolean loading = true;

public EndlessScrollListener() {
}
public EndlessScrollListener(int visibleThreshold) {
this.visibleThreshold = visibleThreshold;
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
currentPage++;
}
}
if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
// I load the next page of gigs using a background task,
// but you can call any function here.
// new LoadGigsTask().execute(currentPage + 1);
Toast.makeText(getApplicationContext(), "end shode", Toast.LENGTH_SHORT).show();

page++;
urlmozaedeh = "http://domain.ir/api/matlab/?page=2";
new JSONParse().execute();
loading = true;
}
}

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {

}
}


اگر کسی اطلاعی داره کمک کنه ممنون میشم

bahram32
سه شنبه 22 دی 1394, 23:02 عصر
کسی پاسخ نمیده؟

Nevercom
چهارشنبه 23 دی 1394, 12:01 عصر
شما با هربار دریافت اطلاعات جدید، یک آداپتور جدید می سازید و برای لیست ویو ست می کنید، مسلماً در این شرایط همه ی اطلاعات قبلی از بین میره.

اول اینکه ساختار آداپتور رو باید تغییر بدید، بجای اینکه داده ها رو در Constructor دریافت کنید، متدی در کلاس آداپتور بسازید که داده ها رو دریافت کنه.
در این متد چک کنید که اگر داده ای از قبل موجود بود، داده های جدید رو بهشون اضافه کنه (و نه جایگزین)

بعد در هربار دریافت داده، فقط داده ها رو به آداپتور اضافه کنید و متد notifyDatasetChanged رو صدا بزنید.

Mohadi
چهارشنبه 23 دی 1394, 18:55 عصر
اول بگم واسه اینکه کارت ساده بشه از این کتابخونه استفاده کن.
https://github.com/shontauro/android-pulltorefresh-and-loadmore
طرزکارش ساده است داخلش نمونه هم داره.

برای رفع مشکلت هم از ArrayList<String> به جای String[] استفاده کن.
موفق باشی