2016-01-06 72 views
0

我需要你的帮助,与我目前的项目。要求是让listview分页,并在向下滚动时加载其他数据,就像Facebook和Twitter应用一样。Android listview无限滚动使用Retrofit

这是我到目前为止已经试过:

MainActivity

listView.setOnScrollListener(new InfiniteScrollListener() { 
     public boolean onLoadMore(int page, int totalItemsCount) { 
      // Triggered only when new data needs to be appended to the list 
      // Add whatever code is needed to append new items to your AdapterView 
      customLoadMoreDataFromApi(page); 
      // or customLoadMoreDataFromApi(totalItemsCount); 
      return true; // ONLY if more data is actually being loaded; false otherwise. 
     } 
    }); 


private void getData() { 
    if(ConnectionDetector.hasNetworkConnection(getActivity())) { 
     RestAdapter restAdapter = new RestAdapter.Builder() 
       .setEndpoint(HOME_DOMAIN) 
       .setLogLevel(RestAdapter.LogLevel.FULL) 
       .build(); 

     WebServices service = restAdapter.create(WebServices.class); 

     service.getRecords(
       "1", // Row 
       "10", // Count 
       new Callback<World>() { 
        @Override 
        public void success(Som som, Response response) { 
         dataList = Parser.getResponseBody(response); 
         adapter = new SomAdapter(getActivity(), dataList); 
         listView.setAdapter(adapter); 
        } 

        @Override 
        public void failure(RetrofitError retrofitError) { 
         Log.e(TAG, "" + retrofitError.toString()); 
        } 
       }); 

    } else { 
     Toast.makeText(getActivity(), 
       getActivity().getResources().getString(R.string.connection_error), 
       Toast.LENGTH_SHORT).show(); 
    } 

} 

// Append more data into the adapter 
public void customLoadMoreDataFromApi(int offset) { 
    // This method probably sends out a network request and appends new data items to your adapter. 
    // Use the offset value and add it as a parameter to your API request to retrieve paginated data. 
    // Deserialize API response and then construct new objects to append to the adapter 
    getData(); 
    moreProgress.setVisibility(View.VISIBLE); 
    Log.e(TAG, "MORE PROGRESS"); 
} 

InfiniteScrollListener:

public abstract class InfiniteScrollListener implements AbsListView.OnScrollListener { 

private int bufferItemCount = 10; 
private int currentPage = 0; 
private int itemCount = 0; 
private boolean isLoading = true; 

public InfiniteScrollListener(int bufferItemCount) { 
    this.bufferItemCount = bufferItemCount; 
} 

public abstract void loadMore(int page, int totalItemsCount); 

@Override 
public void onScrollStateChanged(AbsListView view, int scrollState) { 
    // Do Nothing 
} 

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
{ 
    if (totalItemCount < itemCount) { 
     this.itemCount = totalItemCount; 
     if (totalItemCount == 0) { 
      this.isLoading = true; } 
    } 

    if (isLoading && (totalItemCount > itemCount)) { 
     isLoading = false; 
     itemCount = totalItemCount; 
     currentPage++; 
    } 

    if (!isLoading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + bufferItemCount)) { 
     loadMore(currentPage + 1, totalItemCount); 
     isLoading = true; 
    } 
} 

}

这显示是滚动时的进度条。这工作,但我也需要附加到列表视图下一个获取的数据。我该怎么做?我需要你的建议,因为这是我第一次在Android中进行分页。谢谢!

回答

0

你做的一切都没错。但是,而不是创造新的SomAdapter,你只需要获取新数据添加到它

@Override 
public void success(Som som, Response response) { 
    dataList = Parser.getResponseBody(response); 
    if (adapter == null) { 
     adapter = new SomAdapter(getActivity(),dataList); 
     listView.setAdapter(adapter); 
    } else { 
     adapter.addAll(dataList); 
    } 
} 

如果你做的不是扩展ArrayAdapter定制适配器,请确保您的addAll方法有notifyDataSetChanged

更改getData()以获取参数偏移量和您的分页请求逻辑。

+0

我有一个自定义适配器。我需要使分页增加10.你可以给样品addAll方法吗?谢谢! –

+0

您必须在dataList和notifyDataSetChanges()中添加数据; dataList.add(结果数据); adapter.notifyDataSetChanged(); –

+0

@aelimill我的意思是自定义适配器的方法? –