مشکل در Lazy Load Listview (حل شده)
من طبق آموزش آقای کاشی زاده و پست هایی که در انجمن زده بود انجام دادم ولی هنگام دریافت اطلاعات با اررور جیسون مواجه میشم.
متد های سرور :
function readData(){
$conn = connectToDataBase();
$part = $_REQUEST['part'];
$start = $part * 10;
$end = $start + 10;
$sql = "SELECT * FROM app WHERE isActive='1' ORDER BY ap_id DESC LIMIT '$start' ,'$end' ";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
$output=array();
while($row = $result->fetch_assoc()) {
$record=array();
$record['app_id']=$row['app_id'];
$record['app_name']=$row['app_name'];
$record['app_vote']=$row['app_vote'];
$record['app_rating']=$row['app_rating'];
$record['app_logourl']=$row['app_logourl'];
$output[]=$record;
}
} else {
echo "0 results";
}
echo json_encode($output);
$conn->close();
}
اینم کدعای ارسال به سرور :
private void populateFromServer() {
String url = "http://192.168.1.51/serial-server/service.php?action=read";
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("part", "" + part));
Log.i("LOG", "part : " + part);
final String result = Webservice.readUrl(url, params);
if (result == null) {
Toast.makeText(ActivitySerials.this, "خطا در اتصال به سرور", Toast.LENGTH_SHORT).show();
} else {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
appes.clear();
JSONArray appes= new JSONArray(result);
for (int i = 0; i < appes.length(); i++) {
JSONObject object = series.getJSONObject(i);
StructSerials serial = new StructSerials();
app.id = object.getLong("app_id");
app.name = object.getString("app_name");
app.ratingValue = (float) object.getDouble("app_rating");
app.logoUrl = object.getString("app_logourl");
app.votes = object.getString("app_vote");
appes.add(app);
}
adapter.notifyDataSetChanged();
part += 1;
list.setIsLoading(false);
}
catch (JSONException e) {
e.printStackTrace();
}
}
});
وقتی اجرا میکنم لیست خالیه و با این اررور مواجه میشم نمیدونم مشکل کار کجاست ؟
اگه راهنماییم کنین ممنون میشم خیلی لنگم :( .














ببینید من این کارو کردم : کجاهاش غلط هستش. چون من زیاد نگرفتم این موضوع Lazy رو.
private ArrayAdapter adapter; ProgressDialog mProgressDialog; ListView lstContent; private int part = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list); lstContent = (ListView) findViewById(R.id.lstContent); lstContent.setOnScrollListener(new OnScrollListener() { public void onScrollStateChanged(AbsListView view, int scrollState) { } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { int lastItemPosition = 0; int lastItem = firstVisibleItem + visibleItemCount; if (adapter.getCount() >= 10 && lastItem > adapter.getCount() - 3) { boolean isLoading = false; if (lastItem > lastItemPosition) { lastItemPosition = adapter.getCount(); new TestAsync().execute(); } isLoading = true; } } }); } class TestAsync extends AsyncTask<ArrayList, String, String> { protected void onPreExecute() { mProgressDialog = new ProgressDialog(ListActivity.this); mProgressDialog.setMessage("لطفا صبر کنید..."); mProgressDialog.setIndeterminate(false); mProgressDialog.setCancelable(false); mProgressDialog.show(); super.onPreExecute(); } @Override protected String doInBackground(ArrayList... arg0) { read(); return null; } protected void onPostExecute(String result) { mProgressDialog.dismiss(); adapter = new AdapterListOstan(G.tasks); lstContent.setAdapter(adapter); } public void onResume() { adapter.notifyDataSetChanged(); part += 1; Log.i("LOG", "part : " + part); } } public void read() { String value = getIntent().getStringExtra("getData"); String url = "http://192.168.1.1/android/note_server/reseller_city.php"; ArrayList params = new ArrayList(); params.add(new BasicNameValuePair("action", "read")); params.add(new BasicNameValuePair("city", value)); params.add(new BasicNameValuePair("part", "" + part)); Log.i("LOG", "params" + params); String result = Webservice.readUrl(url, params); if (result != null) { try { G.tasks.clear(); JSONArray tasks = new JSONArray(result); for (int i = 0; i < tasks.length(); i++) { JSONObject object = tasks.getJSONObject(i); StructTask task = new StructTask(); task.id = object.getLong("id"); task.name = object.getString("name"); task.address = object.getString("address"); Log.i("LOG", "object" + object); G.tasks.add(task); } } catch (JSONException e) { e.printStackTrace(); } } }

این کد : با Async Task
public class ListActivity extends Activity implements LazyListView.LazyListener { private ArrayAdapter adapter; ProgressDialog mProgressDialog; LazyListView lstContent; public int part = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list); lstContent = (LazyListView) findViewById(R.id.lstContent); lstContent.setListener(this); new TestAsync().execute(); } class TestAsync extends AsyncTask<ArrayList<NameValuePair>, String, String> { protected void onPreExecute() { mProgressDialog = new ProgressDialog(ListActivity.this); mProgressDialog.setMessage("لطفا صبر کنید..."); mProgressDialog.setIndeterminate(false); mProgressDialog.setCancelable(false); mProgressDialog.show(); super.onPreExecute(); } @Override protected String doInBackground(ArrayList<NameValuePair>... arg0) { read(); return null; } protected void onPostExecute(String result) { mProgressDialog.dismiss(); adapter = new AdapterListOstan(G.tasks); lstContent.setAdapter(adapter); } public void onResume() { adapter.notifyDataSetChanged(); lstContent.setIsLOding(false); } } public void read() { String value = getIntent().getStringExtra("getData"); String url = "http://192.168.1.1/android/note_server/reseller_city.php"; ArrayList<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("action", "read")); params.add(new BasicNameValuePair("city", value)); params.add(new BasicNameValuePair("part", part + "")); Log.i("LOG", "params" + params); String result = Webservice.readUrl(url, params); if (result != null) { try { G.tasks.clear(); JSONArray tasks = new JSONArray(result); for (int i = 0; i < tasks.length(); i++) { JSONObject object = tasks.getJSONObject(i); StructTask task = new StructTask(); task.id = object.getLong("id"); task.name = object.getString("name"); task.cod = object.getString("code"); task.city = object.getString("city"); task.tell = object.getString("tell"); task.address = object.getString("address"); part += 1; Log.i("LOG", "part : " + part); Log.i("LOG", "object" + object); G.tasks.add(task); } } catch (JSONException e) { e.printStackTrace(); } } } public void onListUpdate() { Toast.makeText(G.context, "Update item", 2000).show(); read(); } }

من فکر کنم بخش سرور رو تغییر دادم درست شد ینی مشکل از کوئریم بود.این کوئری رو تست کن.مشکل اینه که اینو هم درست کنی اونجا که آرایه رو clear میکنی اطلاعات پاک میشه بعد هر درخواست !
$part = $_POST['part'];
$start = $part * 10;
$end = $start + 10;
$sql = "SELECT * FROM serial WHERE isActive=1 ORDER BY serial_id DESC LIMIT $start , $end ";

من در بانکم 40 رکورد دارم وقتی clear رو صدا نکنم اطلاعات پاک نمیشه ولی به جای 40 رکورد ، 60 رکورد نشون میده یعنی یه تعداد اطلاعات تکرار میشه به ازای هر درخواست چی جوری میتونم جلوی تکرار این اطلاعات رو بگیرم ؟ و وقتی متد clear رو درخواست کنم با هر درخواست 10 تا از رکوردم رو در آرایه پاک میکنه و به جای 40 رکورد 20 رکورد نمایش داده میشه مشکل از کجا میتونه باشه ؟ دوستان خواهش میکنم راهنمایی کنین :(

با تعداد ایتم هایی که تو هر بار درخواست میگیری بازی کن.مثلا من سمت اندروید گفتم ده تا ده تا بفرسته و سه تا هم قبل از رسیدن به اخر لیست اپدیت کنه..سمت سرور همه گفتم سیزده تا سیزده تا بفرسته.clear هم صدا نزن

باید سمت سرور تو بخش LIMIT
part که از سمت اندروید با هربار درخواست یکی بهش اضافه میشه و "ده" دوم که ضرب شده برای اینه که رکوردهای قبلی رو نخونه و بعد از اون بگیره.و قمست سوم یعنی "ده" ،تعداد آیتم درخواستیه.که باید ثابت باشه.با کار قبلی (یعنی اونی که محمدحسین گفته بود) این عدد مرتب افزایش پیدا میکرد و داده ها قاطی میشدن
LIMIT part*10,10
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .