View Full Version : لود کردن محتوا زمانی که اسکرول انجام می شود
bahman72313
سه شنبه 05 مرداد 1395, 16:43 عصر
سلام دوستان فرض کنید ما می خواهیم اطلاعاتی که متشکل از عکس و متن می باشند را از سرور دریافت و در یک اسکرول ویو نمایش دهیم.چطوری میشه به جای لود کردن همه ی اطلاعات، تیکه تیکه آن ها را متناسب با اسکرول کاربر از سرور دریافت و نمایش داد؟ به طور مثال 100 خبر ما در طرف سرور داریم که می خواهیم تیتر و عکس همه ی این اخبار را در یک اسکرول ویو نمایش دهیم اگر به هنگام شروع اکتیویتی مقدار محتویات همه ی 100 خبر را دانلود و نمایش دهیم مدت زمان بسیاری طول میکشد و از لحاظ زمانی و هزینه این رویکرد اصلا بهینه نیست.رویکرد جایگزین به نظر شما چیه؟
hasan_esfahan
پنج شنبه 07 مرداد 1395, 16:12 عصر
تویی گیت هاب سرچ بزن
android listview Endless Scrolling
مثال زیاد هست
یه توضیح بدهم شما میتونی یه تلرانس در نظر بگیری بعد خودش بهت خبر میدهد و شما ادامه دانلود انجام میدهی
تویی مثال ها ببینی متوجه حرفم میشی
hasan_esfahan
پنج شنبه 07 مرداد 1395, 16:15 عصر
این کد برای لیست ویو هست
public abstract class AdsGridViewScrollListener implements OnScrollListener {
private int firstLoadMoreThreshold = 20;
private int firstVisibleOnStartDrag = 0;
private boolean firstDragAndDrops = false;
private int visibleThreshold = 5;
private int previousTotalItemCount = 0;
private boolean loading = true;
public abstract void onFirstLoadDrag();
public abstract void onFirstLoadDrop(boolean dropCurrect);
public abstract void onLoadMore(int totalItemsCount);
@Override
public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount)
{
try
{
if (totalItemCount < previousTotalItemCount) {
this.previousTotalItemCount = totalItemCount;
if (totalItemCount == 0)
this.loading = true;
}
if (loading && (totalItemCount > previousTotalItemCount)) {
loading = false;
previousTotalItemCount = totalItemCount;
}
if (!loading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + visibleThreshold)) {
loading = true;
onLoadMore( totalItemCount);
}
if(firstDragAndDrops)
{
int newPosition = getFirstItemPosition(view);
if(newPosition>firstVisibleOnStartDrag){
firstDragAndDrops = false;
onFirstLoadDrop(false);
}
}
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void onScrollStateChanged(final AbsListView view, int scrollState)
{
if( view.getFirstVisiblePosition() == 0 && scrollState == SCROLL_STATE_TOUCH_SCROLL)
{
int tmp = getFirstItemPosition(view);
if(tmp<firstLoadMoreThreshold)
{
firstVisibleOnStartDrag = tmp;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
int tmp = getFirstItemPosition(view);
if(tmp<=firstLoadMoreThreshold){
firstDragAndDrops = true;
onFirstLoadDrag();
}
}
}, 200);
}
}
if(scrollState == SCROLL_STATE_IDLE)
{
if(firstDragAndDrops && view.getFirstVisiblePosition() == 0){
if(getFirstItemPosition(view)<firstLoadMoreThreshold)
onFirstLoadDrop(true);
else
onFirstLoadDrop(false);
}
firstDragAndDrops = false;
}
}
private int getFirstItemPosition(AbsListView view)
{
try
{
View c = view.getChildAt(0);
return (-c.getTop() + view.getFirstVisiblePosition() * c.getHeight());
}
catch (Exception e) {
}
return 0;
}
}
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.