آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

شهریار توکلی  9 سال پیش  9 سال پیش
+1 0

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

متد های سرور :

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

});

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

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

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

 

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

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

	}

}
پاسخ به سوال 
شهریار توکلی  9 سال پیش
0 0

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

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

 
پاسخ به سوال 
YouNes Sh  9 سال پیش
+1 0

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

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

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

 LIMIT part*10,10
0 0
یک سوال دیگه ؟ من وقتی لیست رو لود میکن لیست بر میگرده به اول لیست چی کار کنم دیگه به اول لیست بر نگرده به همون پایین اضافه بشه ؟ (9 سال پیش)
0 0
کد ادپترتو بزار (9 سال پیش)
+1 0
تقریبا مشکل از Asynk task بودد یه جورایی .Asynk task رو برداشتم . مستقیم از متد populateFromServer میخونم مشکلم حل شد . (9 سال پیش)
0 0
شهریار جان اگه مشکلت کلا حل شده برای منم بنویس کدشو . چون من نتونستم درست کنم.ممنون. (9 سال پیش)

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