2016-01-19 1 views
0

Позвольте мне кратко объяснить структуру своей деятельности. Когда пользователь входит в приложение, они немедленно отправляются на фрагмент, отображающий ScrollView, содержащий серию макетов. Макеты заполняются данными, вытащенными с сервера, причем первые десять или около того загружаются при создании фрагмента. Когда пользователь прокручивает ScrollView, я хотел бы добавить новые макеты в нижней части ScrollView, чтобы все данные не собирались сразу с сервера и чтобы список записей не превышал размер должен быть.Автоматическая загрузка новых записей с сервера в ScrollView при прокрутке пользователя

Примером этого может служить новостная лента новостей Facebook по их андроидному приложению или прокрутка изображений Instagram. Приложение Gmail также имеет такое поведение, загружая электронные письма по мере необходимости. Во всех случаях новые данные загружаются, когда пользователь прокручивает страницу вниз.

Вопрос в том, как лучше всего реализовать этот тип поведения?

я определяю лучше всего, как:

  • Наиболее эффективным
  • Самый портативный (функционал на большинстве телефонов и большинство версий API)
  • Легче сохранить и расширить
  • Следит принятые стандарты и конвенции Android

Чтобы быть ясным, я не просто ищу a решение, но лучшее решение. Я знаю, что существует множество способов реализации этого поведения, но я ищу окончательное решение. Пожалуйста, добавьте несколько предложений, объясняющих, почему ваш метод является лучшим. Спасибо.

+0

Так в прошивке, вы можете проверить, если вид прокрутки достиг дна ** и ** вы можете сказать, как далеко прокрутка зрения прокручивается в нижней части. Можете ли вы сделать это с делегатом Android ScrollView? – iSkore

ответ

0

вы можете использовать этот класс для загрузки большего количества деталей от сервера

общественного класс LoadMoreListView расширяет ListView реализует OnScrollListener {

private static final String TAG = "LoadMoreListView"; 

/** 
* Listener that will receive notifications every time the list scrolls. 
*/ 
private OnScrollListener mOnScrollListener; 
private LayoutInflater mInflater; 

// footer view 
private RelativeLayout mFooterView; 
// private TextView mLabLoadMore; 
private ProgressBar mProgressBarLoadMore; 

// Listener to process load more items when user reaches the end of the list 
private OnLoadMoreListener mOnLoadMoreListener; 
// To know if the list is loading more items 
private boolean mIsLoadingMore = false; 
private int mCurrentScrollState; 

public LoadMoreListView(Context context) { 
    super(context); 
    init(context); 
} 

public LoadMoreListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context); 
} 

public LoadMoreListView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(context); 
} 

private void init(Context context) { 

    mInflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    // footer 
    mFooterView = (RelativeLayout) mInflater.inflate(
      R.layout.load_more_footer, this, false); 
    /* 
    * mLabLoadMore = (TextView) mFooterView 
    * .findViewById(R.id.load_more_lab_view); 
    */ 
    mProgressBarLoadMore = (ProgressBar) mFooterView 
      .findViewById(R.id.load_more_progressBar); 

    addFooterView(mFooterView); 

    super.setOnScrollListener(this); 
} 

@Override 
public void setAdapter(ListAdapter adapter) { 
    super.setAdapter(adapter); 
} 

/** 
* Set the listener that will receive notifications every time the list 
* scrolls. 
* 
* @param l 
*   The scroll listener. 
*/ 
@Override 
public void setOnScrollListener(AbsListView.OnScrollListener l) { 
    mOnScrollListener = l; 
} 

/** 
* Register a callback to be invoked when this list reaches the end (last 
* item be visible) 
* 
* @param onLoadMoreListener 
*   The callback to run. 
*/ 

public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) { 
    mOnLoadMoreListener = onLoadMoreListener; 
} 

public void onScroll(AbsListView view, int firstVisibleItem, 
     int visibleItemCount, int totalItemCount) { 

    if (mOnScrollListener != null) { 
     mOnScrollListener.onScroll(view, firstVisibleItem, 
       visibleItemCount, totalItemCount); 
    } 

    if (mOnLoadMoreListener != null) { 

     if (visibleItemCount == totalItemCount) { 
      mProgressBarLoadMore.setVisibility(View.GONE); 
      // mLabLoadMore.setVisibility(View.GONE); 
      return; 
     } 

     boolean loadMore = firstVisibleItem + visibleItemCount >= totalItemCount; 

     if (!mIsLoadingMore && loadMore 
       && mCurrentScrollState != SCROLL_STATE_IDLE) { 
      mProgressBarLoadMore.setVisibility(View.VISIBLE); 
      // mLabLoadMore.setVisibility(View.VISIBLE); 
      mIsLoadingMore = true; 
      onLoadMore(); 
     } 

    } 

} 

public void onScrollStateChanged(AbsListView view, int scrollState) { 

    // bug fix: listview was not clickable after scroll 
    if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { 
     view.invalidateViews(); 
    } 

    mCurrentScrollState = scrollState; 

    if (mOnScrollListener != null) { 
     mOnScrollListener.onScrollStateChanged(view, scrollState); 
    } 

} 

public void onLoadMore() { 
    Log.d(TAG, "onLoadMore"); 
    if (mOnLoadMoreListener != null) { 
     mOnLoadMoreListener.onLoadMore(); 
    } 
} 

/** 
* Notify the loading more operation has finished 
*/ 
public void onLoadMoreComplete() { 
    mIsLoadingMore = false; 
    mProgressBarLoadMore.setVisibility(View.GONE); 
} 

/** 
* Interface definition for a callback to be invoked when list reaches the 
* last item (the user load more items in the list) 
*/ 
public interface OnLoadMoreListener { 
    /** 
    * Called when the list reaches the last item (the last item is visible 
    * to the user) 
    */ 
    public void onLoadMore(); 
} 

}

это настраиваемое представление списка для загрузки больше элементов из server.you должен использовать класс LoadMoreListView для этой работы. И вы можете вызвать этот класс в xml, как это

 <com.broadpeak.nvoice.utils.LoadMoreListView 
     android:id="@+id/lv" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

lmlv = (LoadMoreListView) view.findViewById(R.id.lv); 
    lmlv.setOnLoadMoreListener(new OnLoadMoreListener() { 

     @Override 
     public void onLoadMore() { 

     } 
    }); 

, если любой запрос, то вы можете связаться свободно ....

0

Метод вы пытаетесь использовать, называется LazyLoading Как предложил пути в развитии Android вы можете использовать recycler views и RecyclerAdapter для достижения этой ,

Сначала определите адаптер Recycler и вид и то, вы можете установить onScrollListener к адаптеру рециркуляции, и он должен идти, как (Original Source)

public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener { 
    public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName(); 

    private int previousTotal = 0; // The total number of items in the dataset after the last load 
    private boolean loading = true; // True if we are still waiting for the last set of data to load. 
    private int visibleThreshold = 5; // The minimum amount of items to have below your current scroll position before loading more. 
    int firstVisibleItem, visibleItemCount, totalItemCount; 

    private int current_page = 1; 

    private LinearLayoutManager mLinearLayoutManager; 

    public EndlessRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager) { 
     this.mLinearLayoutManager = linearLayoutManager; 
    } 

    @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     super.onScrolled(recyclerView, dx, dy); 

     visibleItemCount = recyclerView.getChildCount(); 
     totalItemCount = mLinearLayoutManager.getItemCount(); 
     firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition(); 

     if (loading) { 
      if (totalItemCount > previousTotal) { 
       loading = false; 
       previousTotal = totalItemCount; 
      } 
     } 
     if (!loading && (totalItemCount - visibleItemCount) 
       <= (firstVisibleItem + visibleThreshold)) { 
      // End has been reached 

      // Do something 
      // like Load from server 
      current_page++; 

      onLoadMore(current_page); 

      loading = true; 
     } 
    } 

    public abstract void onLoadMore(int current_page); 
} 

Как вы можете видеть, что вы можете сделать запросы к серверу на onScrolled методе, комментировали, которые я думаю, что вы можете сделать с библиотеками, как ДООСНАСТКИ или okHttp