как избежать бесконечного вызова getView при аннулировании данных адаптера?

#java #android #listview #android-listview

#java #Android #listview #android-listview

Вопрос:

Я хочу реализовать отложенную загрузку элементов с сервера с использованием Android ListView.

Для этого предложения я добавил следующий код в свой адаптер:

 @Override
public View getView(final int position, View convertView, ViewGroup parent) {

    if (position != 0 amp;amp; position % 7 == 0)
    // ask next page
    {
        mOffersListActivity.getOffersFromServer(ListType.FULL, 10, 10);
    }
  

Это вызывает действие хостинга, которое загружает следующий пакет с сервера:

 @SuppressWarnings("unchecked")
private void afterServerOfferResponse(final Gson gson,
        String result) {

    boolean hadError = false;

    Type collectionType = new TypeToken<ArrayList<Offer>>() {
    }.getType();

    if (mOffersList == null) {
        mOffersList = new ArrayList<Offer>();
    }
    mOffersList.addAll((Collection<? extends Offer>) gson
            .fromJson(result, collectionType));

    if (mOffersList == null || mOffersList.size() == 0) {
        errorMsg.setText("no offers found");
        hadError = true;
    } else {

        if (mAdapter == null) {
            mAdapter = new ImageAdapter(
                    OffersListActivity.this, mOffersList,
                    listType);
            mListView.setAdapter(mAdapter);
        }
        // mAdapter.notifyDataSetChanged();
        mListView.invalidate();
    }
  

Проблема в том, что getView для позиций 7, 14 и так далее вызывается бесконечно

как я могу этого избежать?

Я подумал поместить this is the adpater вместо %7 code :

 if (mOffersList.size() - 3 == position)
        // ask next page
{
    mOffersListActivity.getOffersFromServer(ListType.FULL, 10, 10);
}
  

Есть еще идеи?

Комментарии:

1. Попробуйте это github.com/commonsguy/cwac-endless

Ответ №1:

Каждый раз, когда вы вызываете getOffersFromServer, это похоже на перезагрузку вашего адаптера, поэтому он также перезагружает eview…

Но этот подход мне не кажется правильным, вам придется постоянно поддерживать соединение открытым, что очень плохо, предпочтительнее загрузить все или, по крайней мере, хороший фрагмент данных, прежде чем что-либо показывать, вы избежите больших сетевых издержек и потери заряда батареи из-за постоянных сетевых вызовов connection e.