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

سوال در مورد Lazy loading(حل شد)

علی  10 سال پیش  10 سال پیش
+1 0

سلام :

من با استفاده از آموزش آقای کاشی زاده Lazy Loading ListView رو راه اندازی کردم.

همه چی خوب کار می کنه ولی هر  10 بار که لیست جدید لود میشه و بارگذاری میشه لیست میاد اول صفحه و از همونجا نمی تونم لیست جدید رو لود کنم باید scrol کنم برم پایین تا لیست بعدی لود بشه.

مشکل از کجاست؟

 lstContent.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {

}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int lastItem = firstVisibleItem + visibleItemCount;
if (adapter.getCount() >= 10 && lastItem > adapter.getCount() - 1) {
isLoading = false;
if (!isLoading) {
if (lastItem > lastItemPosition) {
lastItemPosition = adapter.getCount();
new TestAsync().execute();
}
isLoading = true;
}

}
}

});
new TestAsync().execute();

}
0 0
از این استفاده کنید < هر بار که لیست جدید رو میگیرید < lstContent.setSelection(firstVisibleItem); (10 سال پیش)
0 0
یعنی بعد new TesAsync بزارم ;(lstContent.setSelection(firstVisibleItem ؟ (10 سال پیش)
0 0
توی TestAsync اطلاعات جدید رو چجوری به لیست میدید؟ (10 سال پیش)
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
علی  10 سال پیش
0 0

این اطلاعات من نصرتی جان 

 @Override
protected void onPostExecute(String arg0) {

mProgressDialog.dismiss();
lstContent.setAdapter(adapter);
adapter.notifyDataSetChanged();
part += 1;
Log.i("LOG", "part : " + part);

}

}

public void newsRead() {
String url = "http://192.168.1.1/android/note_server/news.php?action=read";
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("part", "" + part));
String result = Webservice.readUrl(url, params);
if (result != null) {
try {
JSONArray tasks = new JSONArray(result);
for (int i = 0; i < tasks.length(); i++) {
JSONObject object = tasks.getJSONObject(i);
StructNews task = new StructNews();
task.id = object.getLong("news_id");
task.title = object.getString("news_title");
task.desc = object.getString("news_desc");
task.date = object.getString("news_date");
G.newss.add(task);
}

} catch (JSONException e) {
e.printStackTrace();
}
}
}
0 0
شما بجای اینکه Adapter رو از نو set کنید باید آرایه اون رو تغییر بدید و بعد از متد notify استفاده کنید. الان اگه لیست شما مستقیما از G.newss تغذیه میشه همون notify کافی هست. (10 سال پیش)
0 0
نصرتی جان من از lstContent.setAdapter(adapter); همونجا استفاده کردم در جای دیگه استفاده نکردم. الان گیج شدم! (10 سال پیش)
پاسخ به سوال 
علی  10 سال پیش
0 0

الان این کد با کمی تغییر ولی ارور میده !

 

 lstContent = (ListView) findViewById(R.id.lstContent);
adapter = new AdapterNews(G.newss);

lstContent.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int lastItem = firstVisibleItem + visibleItemCount;
if (adapter.getCount() >= 20 && lastItem > adapter.getCount() - 3) {
isLoading = false;
if (!isLoading) {
if (lastItem > lastItemPosition) {
lastItemPosition = adapter.getCount();
new NewsData().execute();
}
isLoading = true;
}
}
}
});
new NewsData().execute();

}

class NewsData extends AsyncTask<ArrayList<NameValuePair>, Void, String>{

@Override
protected String doInBackground(ArrayList<NameValuePair>... arg0) {

String url = "http://192.168.1.1/android/note_server/news.php?action=read";
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("part", "" + part));
String result = Webservice.readUrl(url, params);
if (result != null) {
try {
JSONArray tasks = new JSONArray(result);
for (int i = 0; i < tasks.length(); i++) {
JSONObject object = tasks.getJSONObject(i);
StructNews task = new StructNews();
task.id = object.getLong("news_id");
task.title = object.getString("news_title");
task.desc = object.getString("news_desc");
task.date = object.getString("news_date");
G.newss.add(task);
}
adapter.notifyDataSetChanged();
part += 1;
} catch (JSONException e) {
e.printStackTrace();
}
}
return null;
}

@Override
protected void onPreExecute() {
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setMessage("لطفا صبر کنید...");
mProgressDialog.setIndeterminate(false);
mProgressDialog.show();
mProgressDialog.setCancelable(false);
super.onPreExecute();
}


@Override
protected void onPostExecute(String arg0) {
mProgressDialog.dismiss();
lstContent.setAdapter(adapter);

}
}

@Override
public void onDestroy() {
super.onDestroy();
G.newss.clear();

}

 

+1 0
منم گیج شدم D: الان نفهمیدم مشکلتون حل شده یا نشده، الان این کدهاتون باید درست کار کنن (فارغ از اینکه میشه خیلی تمیزتر هم نوشتشون و از حوصله من خارج هست :) (10 سال پیش)
0 0
الان اگر فقط متد ()newsRead فراخونی کنم درسته ولی اگر بیام از اون AsyncTask استفاده کنم درست نیست. نصرتی جان میدونم وقت نداری و من در بیشتر پروژه ها می خوام استفاده کنم از AsyncTask ، اگر امکان داره یه راهنمایی کن که چطور تمیزتر بنویسم. (10 سال پیش)
0 0
کد بالا رو تغییر دادم ولی در لود دوم ارور میده و میاد بیرون از برنامه. الان تمیزتر شد نصرتی جان؟ (10 سال پیش)
پاسخ به سوال 
Spirit  10 سال پیش
+3 0

من این شکلی با کمترین اضافه کاری نوشتم البته ایراد ممکنه داشته باشه ولی اضافه شدن موارد جدید کار میکنه، یه نگاه بکنید اگر مشکلتون حل نشد ادامه بدیم :)

 public class MyActivity extends Activity {

List<String> items = new ArrayList<>();
ArrayAdapter<String> adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ListView listView = new ListView(this);
setContentView(listView);

adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
android.R.id.text1,
items);

listView.setAdapter(adapter);
new GetData().execute();

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
}

@Override
public void onScroll(AbsListView absListView,
int firstVisibleItem,
int visibleItemCount,
int totalItemCount) {

int lastItem = firstVisibleItem + visibleItemCount;
if (adapter.getCount() == lastItem) {
new GetData().execute();
}
}
});
}

class GetData extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
for (int i = 0; i < 20; i++) {
items.add("Item");
}
return null;
}

@Override
protected void onPostExecute(Void aVoid) {
adapter.notifyDataSetChanged();
}
}
}

البته منظورم از تمیزتر یه چیز دیگه بود باید، پیاده سازی برنامه بر اساس معماری MVP که خودم هم بزودی قراره یادبگیرمش.

0 0
mvp رو منم میتونم یادبگیرم از طریق سرچ در گوگل؟ (10 سال پیش)
+2 0
چرا که نه "mvp architecture android" هم مقاله، هم نمونه های کارشده موجوده. (10 سال پیش)
پاسخ به سوال 
علی  10 سال پیش
+4 0

ممنون از نصرتی عزیز . اینطوری درست شد ! میزارم برای بقیه دوستان اگر نیاز دارند.

 public class MainActivity extends Activity {

private ArrayAdapter adapter;
private ProgressDialog mProgressDialog;
private ListView lstContent;
private int part = 0;
private int lastItemPosition = 0;
private boolean isLoading = true;

@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

lstContent = (ListView) findViewById(R.id.lstContent);

new NewsData().execute();
adapter = new AdapterNews(G.newss);
lstContent.setAdapter(adapter);

lstContent.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int lastItem = firstVisibleItem + visibleItemCount;
if (adapter.getCount() >= 20 && lastItem > adapter.getCount() - 3) {
isLoading = false;
if (!isLoading) {
if (lastItem > lastItemPosition) {
lastItemPosition = adapter.getCount();
new NewsData().execute();
}
isLoading = true;

}
}
}
});

}

class NewsData extends AsyncTask<ArrayList<NameValuePair>, Void, String>{

@Override
protected String doInBackground(ArrayList<NameValuePair>... arg0) {

String url = "http://192.168.1.1/android/note_server/news.php?action=read";
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("part", "" + part));
String result = Webservice.readUrl(url, params);
if (result != null) {
try {
JSONArray tasks = new JSONArray(result);
for (int i = 0; i < tasks.length(); i++) {
JSONObject object = tasks.getJSONObject(i);
StructNews task = new StructNews();
task.id = object.getLong("news_id");
task.title = object.getString("news_title");
task.desc = object.getString("news_desc");
task.date = object.getString("news_date");
G.newss.add(task);
}

} catch (JSONException e) {
e.printStackTrace();
}


}
return null;
}

@Override
protected void onPreExecute() {
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setMessage("لطفا صبر کنید...");
mProgressDialog.setIndeterminate(false);
mProgressDialog.show();
mProgressDialog.setCancelable(false);
super.onPreExecute();
}


@Override
protected void onPostExecute(String arg0) {
mProgressDialog.dismiss();
adapter.notifyDataSetChanged();
part += 1;

}
}

@Override
public void onDestroy() {
super.onDestroy();
G.newss.clear();

}

}

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