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

مشکل در Lazy Load Listview (حل شده)

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

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

متد های سرور :

 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();
}
}

});

وقتی اجرا میکنم لیست خالیه و با این اررور مواجه میشم نمیدونم مشکل کار کجاست ؟
اگه راهنماییم کنین ممنون میشم خیلی لنگم :( .

نظرات

کاشی زاده 11 سال پیش
موقع خوندن داده ها اشتباه دارید ، میگه شما دارید یک جیسون رشته ای رو به یک آرایه از جیسون تبدیل میکنید و اینکار شدنی نیست
شهریار توکلی 11 سال پیش
مشکل از کجا میتونه باشه ؟ بخش سرور یا کلاینت؟
کاشی زاده 11 سال پیش
از کلاینت هست مشکل ببین کجا داری داده های json رو پارس میکنی .
علی 11 سال پیش
shahryarjb جان میشه کدی که داره part رو post میکنه رو اینجا بزاری که منم بتونم lazy درست کنم؟
شهریار توکلی 11 سال پیش
علی بالا قرار دادم .کدوم قسمت منظورته؟ من فعلا مشکلم حل نشد.همه چی رو به اول بر میگردونم مشکلی ندارم.نمیدونم مشکلم از کجاست!؟ اگه درست کردی کدش بزار من هم استفاده کنم.
علی 11 سال پیش
منظورم اینه اون part رو کجا مقدار دهی کردی که داری میفرستی؟
شهریار توکلی 11 سال پیش
اول برنامه یه متغیر به نام پارت تعریف کردم و مقدار اولشو صفر قرار دادم
علی 11 سال پیش
اها مرسی . من اینو هم نفهمیدم ؟ ;()receivedData
شهریار توکلی 11 سال پیش
آقای کشای زاده.تقریبا مشکلم حل شد هر دفعه تعداد 10 تا آیتم از سرور دریافت میشه ولی مشکلی که دارم درخواست بعدی که از سرور میشه اطلاعات قبلی من از سرور پاک میشه چی جوری میتونم این مشکلو برطرف کنم ؟ اگه آرایه رو Clear نکنم اطلاعات بعد هر درخواست بیشتر میشه !؟
شهریار توکلی 11 سال پیش
آقای کاشی زاده.تقریبا مشکلم حل شد هر دفعه تعداد 10 تا آیتم از سرور دریافت میشه ولی مشکلی که دارم درخواست بعدی که از سرور میشه اطلاعات قبلی من از سرور پاک میشه چی جوری میتونم این مشکلو برطرف کنم ؟ اگه آرایه رو Clear نکنم اطلاعات بعد هر درخواست بیشتر میشه !؟

پاسخ‌ها 6

علی 11 سال پیش

ببینید من این کارو کردم : کجاهاش غلط هستش. چون من زیاد نگرفتم این موضوع 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();
			}
		}
	}

 

نظرات

شهریار توکلی 11 سال پیش
علی جان شما ویدئوی آقای کاشی زاده رو دانلود کردی؟ حتما دانلود کن ببین.مشکل من حل شد.خودم نمیدونم چی جوری حل شد ولی داره کار میکنه
علی 11 سال پیش
کجاست ویدئوی ایشون؟
علی 11 سال پیش
خب من طبق آموزش ویدو آقای کاشی زاده رفتم جلو . حالا دقیقا مشکل شما رو دارم. هیچی تو لیست نمیاد :(
علی 11 سال پیش
خب من طبق آموزش ویدو آقای کاشی زاده رفتم جلو . حالا دقیقا مشکل شما رو دارم. هیچی تو لیست نمیاد :(
شهریار توکلی 11 سال پیش
تازه درستش کنی بعدش یه مشکل میخوری.مشکل اینه که بعد از اجرا هر درخواست به سرور آرایه رو پاک میکنی . مثلا داخل بانک اطلاعاتی 30 تا رکورد داری.بار اول 10 تا رکورد رو میگیری نمایش میدی برای بار دوم 10 تا اطلاعای که گرفتی پاک میشه و به جای 30 تا 20 رکورد نمایش میده حالا اگه اون clear رو برداری مشکلی که پیش میاد بعد هر درخواست اطلاعت تکراری تو لیست ویو میبینی. من گیج شدم نمیدونم چی کار کنم :( :/
علی 11 سال پیش
چه سخت شده کار ! من واقعا به این Lazy احتیاج دارم. او ارور اول رو چطوری حل کردی که اول سوال پرسیدی؟
rad 11 سال پیش
آرزوی موفقیت دارم براتون
علی 11 سال پیش

این کد : با 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();

	}

}

نظرات

شهریار توکلی 11 سال پیش

من فکر کنم بخش سرور رو تغییر دادم درست شد ینی مشکل از کوئریم بود.این کوئری رو تست کن.مشکل اینه که اینو هم درست کنی اونجا که آرایه رو 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 ";

نظرات

شهریار توکلی 11 سال پیش

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

 

نظرات

YouNes Sh 11 سال پیش

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

نظرات

شهریار توکلی 11 سال پیش
چرای اینجوریه :O . من سمت سرور رو گذاشتم رو 20 درست شد . سمت کلاینت هم رو ده تا ده تاس و سه تای قبل برسه به آخر لیست آپدیت میکنه
YouNes Sh 11 سال پیش
شهریار یه چیزی فهمیدم.الان لیستت درسته؟تکراری نشون نمیده؟اگه نمیده برو تعداد رکورداتو افزایش بده(6 -7 تا اضافه کن) بعد نتیجشو بیا بهم بگو
شهریار توکلی 11 سال پیش
من فکر کنم وقتی 40 رکورد دارم نصف این عدد رو باید تو سرور قرار بدم که درست بشه.اگه 50 تا رکورد باید25 بدم تو سرور. فکر کنم اگه رکورد اضافه بشه و اون عدد ثابت بشه.باز لیست بهم بخوره درسته ؟
YouNes Sh 11 سال پیش
آره تعداد دینامیک باشه همه چی بهم میریزه دلیلشو تو جواب مینویسم بدرد بقیه هم بخوره
شهریار توکلی 11 سال پیش
مرسی که این مشکلو حل کردی.البته تو فروم برنامه نویس هم همین جواب شما رو دادن لینک
YouNes Sh 11 سال پیش

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

 LIMIT part*10,10

نظرات

شهریار توکلی 11 سال پیش
یک سوال دیگه ؟ من وقتی لیست رو لود میکن لیست بر میگرده به اول لیست چی کار کنم دیگه به اول لیست بر نگرده به همون پایین اضافه بشه ؟
YouNes Sh 11 سال پیش
کد ادپترتو بزار
شهریار توکلی 11 سال پیش
تقریبا مشکل از Asynk task بودد یه جورایی .Asynk task رو برداشتم . مستقیم از متد populateFromServer میخونم مشکلم حل شد .
علی 11 سال پیش
شهریار جان اگه مشکلت کلا حل شده برای منم بنویس کدشو . چون من نتونستم درست کنم.ممنون.

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