2013-10-26 4 views
0

Я хочу добавить динамические данные из веб-службы в нижней части списка. и список должен обновляться, когда я прокручиваю список, чтобы показать старые сообщения. Загрузите следующую страницу .. но мой код делает обратное, то есть прокрутку вверх, чтобы загрузить следующую страницу, и сначала я получаю старые сообщения. мой код. если кто-то может помочь ...Добавлять данные в обновляемый Listview Android динамически?

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.conversations_activity); 
    mListView.setOnScrollListener(new OnScrollListener() { 
       int maxLoads = 30; 
       @Override 
       public void onScrollStateChanged(AbsListView view, int scrollState) {  
       } 

       @Override 
       public void onScroll(AbsListView view, int firstVisibleItem,visibleItemCount, int totalItemCount) { 
      if ((totalItemCount - 1 > maxLoads)&& ((totalItemCount - 1) % maxLoads == 0)) { 
         System.gc(); 
        } 
        if (((firstVisibleItem + visibleItemCount) == totalItemCount) 
          && !isDataLoading && isScrollingEnable) { 
         new LoadNextPage(ConversationsActivity.this).execute(); 
        } 
       } 
      }); 

    new ConversationListTask(ConversationsActivity.this).execute(); 
} 
} 
private class ConversationListTask extends BaseAsyncTask { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     public ConversationListTask(Activity activity) { 
      super(activity); 
     } 

     @Override 
     public void runDoInBackground() throws RuntimeException, Exception { 
      isDataLoading = true; 
      isScrollingEnable = false; 
      mPageNumber = 0; 
      try { 
       listMessage = APIProcessor.listMessage(ConversationsActivity.this, "1", 
         mPageNumber); 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void runOnPostExecute() { 
      isDataLoading = false; 
      isScrollingEnable = true; 

      convoListAdapter = new ConversationListAdapter(
        ConversationsActivity.this, listMessage, urlThumbImageLoader); 
      mListViewConversation.setAdapter(convoListAdapter); 
      mListViewConversation.setSelection(mListViewConversation.getAdapter() 
        .getCount() - 1); 

     } 
    } 
class LoadNextPage extends BaseAsyncTask { 

     public LoadNextPage(Activity activity) { 
      super(activity); 
      setDefaultProgressDialogStatus(false); 
      findViewById(R.id.list_loading_view).setVisibility(View.VISIBLE); 
     } 

     @Override 
     public void runDoInBackground() throws RuntimeException, Exception { 
      isDataLoading = true; 
      tempList = APIProcessor.listMessage(ConversationsActivity.this, "1", 
        mPageNumber + 1); 
     } 

     @Override 
     public void runOnPostExecute() { 
      new LoadNextPage(ConversationsActivity.this).execute(); 
      findViewById(R.id.list_loading_view).setVisibility(View.GONE); 
      isDataLoading = false; 
      if (tempList == null || tempList.isEmpty() || listMessage == null 
        || listMessage.isEmpty()) { 

      } 
      else { 
       mPageNumber++; 
       for (int i = 0; i < tempList.size(); i++) { 
        listMessage.add(tempList.get(i)); 
       } 
       convoListAdapter.notifyDataSetChanged(); 
      } 
     } 

    } 
+1

Выполняется LoadNextPage при каждой задаче postExecute из задачи LoadNextPage. что кажется бесконечным вызовом LoadNextPage. – Devrim

ответ

0

Вы можете обратиться see this link

Может быть, вы пропустите

int currentPosition = lv.getFirstVisiblePosition(); 
lv.setSelectionFromTop(currentPosition + 1, 0); 
0

Я с изложением того, что я вижу в вашем коде:
на ConversationListTask.runOnPostExecute методом вы извлекаете элементы списка. Создайте адаптер и установите его в свой список. Затем вы установите для своего списка последний элемент. Это вызывает прокрутку к последнему элементу, и ваше условие scrolledToBottom становится истинным, а затем начинается LoadNextPage. И когда я прокомментировал ваш вопрос, после вашего первого звонка до LoadNextPage, он создаст и выполнит другой экземпляр его при выполнении своего сообщения и повторит его при каждом выполнении записи, который приведет к бесконечному вызову.

Во-первых, организуйте свой код еще раз. Если вы не хотите, чтобы установить выделение в нижней части после установки адаптера к ListView, а затем удалить этот код из ConversationListTask.runOnPostExecute:

mListViewConversation.setSelection(mListViewConversation.getAdapter().getCount() - 1); 

И прекрати называть LoadNextPage на каждом postExecute из LoadNextPage задачи.

* BTW Вы правильно слушаете scrolledToBottom событие на onScroll. Я использую аналогичную реализацию OnScrollListener и могу поделиться, если хотите.

Смежные вопросы