بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
سوال در مورد Lazy loading(حل شد)
سلام :
من با استفاده از آموزش آقای کاشی زاده 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();
}
}
}
پاسخ به سوال
علی
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();
}
پاسخ به سوال
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 که خودم هم بزودی قراره یادبگیرمش.
پاسخ به سوال
علی
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();
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .