我有一个从api加载电影列表的应用程序,想要添加一个endlessscrolllistener以在用户到达列表底部时加载更多数据,但是我的代码一直在onLoadmore()上重新加载列表,而不是追加到列出并加载相同的current_page,有什么帮助吗?谢谢...
public class MoviesSectionActivity extends AppCompatActivity {
RecyclerView recyclerView;
EndlessRecyclerViewScrollListener scrollListener;
LinearLayoutManager linearLayoutManager;
int CategoryId;
ListAdapter listAdapter;
MovieTask movieTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_movies);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Intent intent = getIntent();
String cat = intent.getStringExtra("Category");
CategoryId = intent.getIntExtra("id", 0);
Bundle bundle = new Bundle();
bundle.putInt("id", CategoryId);
movieTask = new MovieTask(0, CategoryId, this);
movieTask.execute();
getSupportActionBar().setTitle(cat);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
recyclerView = (RecyclerView) findViewById(R.id.recylerView);
linearLayoutManager = new LinearLayoutManager(MoviesSectionActivity.this);
recyclerView.setLayoutManager(linearLayoutManager);
scrollListener = new EndlessRecyclerViewScrollListener(linearLayoutManager) {
@Override
public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
MovieTask movieTask;
this.resetState();
movieTask = new MovieTask(page, CategoryId, MoviesSectionActivity.this);
movieTask.execute();
}
};
recyclerView.addOnScrollListener(scrollListener);
}
public class MovieTask extends AsyncTask<String, String, List<MovieDb>> {
int currntPage;
int movieId;
Context mContext;
MovieTask(int page, int Id, Context context) {
currntPage = page;
movieId = Id;
mContext = context;
}
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(List<MovieDb> movieDbs) {
if (movieDbs != null) {
listAdapter = new ListAdapter(mContext, movieDbs, 3);
recyclerView.setAdapter(listAdapter);
listAdapter.notifyDataSetChanged();
} else {
Toast.makeText(getApplicationContext(), "Try again", Toast.LENGTH_LONG).show();
}
}
@Override
protected List<MovieDb> doInBackground(String... params) {
List<MovieDb> movieDbs;
if (NetworkUtils.networkStatus(getApplicationContext())) {
try {
TmdbApi api = new TmdbApi(ApiContants.api_key);
TmdbMovies movies = api.getMovies();
MovieResultsPage resultsPage;
switch (movieId) {
case 0:
resultsPage = movies.getPopularMovies("en", currntPage);
break;
case 1:
resultsPage = movies.getNowPlayingMovies("en", currntPage);
break;
case 2:
resultsPage = movies.getTopRatedMovies("en", currntPage);
break;
case 3:
resultsPage = movies.getUpcoming("en", currntPage);
break;
default:
resultsPage = movies.getPopularMovies("en", currntPage);
}
movieDbs = resultsPage.getResults();
return movieDbs;
} catch (Exception e) {
return null;
}
} else {
Toast.makeText(mContext, "Try again", Toast.LENGTH_LONG).show();
return null;
}
}
}
}
我无尽的recyclerview ScrollListener;
public abstract class EndlessRecyclerViewScrollListener extends
RecyclerView.OnScrollListener {
// The minimum amount of items to have below your current scroll position
// before loading more.
private int visibleThreshold = 5;
// The current offset index of data you have loaded
private int currentPage = 0;
// The total number of items in the dataset after the last load
private int previousTotalItemCount = 0;
// True if we are still waiting for the last set of data to load.
private boolean loading = true;
// Sets the starting page index
private int startingPageIndex = 0;
RecyclerView.LayoutManager mLayoutManager;
public EndlessRecyclerViewScrollListener(LinearLayoutManager layoutManager)
{
this.mLayoutManager = layoutManager;
}
public EndlessRecyclerViewScrollListener(GridLayoutManager layoutManager) {
this.mLayoutManager = layoutManager;
visibleThreshold = visibleThreshold * layoutManager.getSpanCount();
}
public EndlessRecyclerViewScrollListener(StaggeredGridLayoutManager layoutManager) {
this.mLayoutManager = layoutManager;
visibleThreshold = visibleThreshold * layoutManager.getSpanCount();
}
public void resetPage() {
currentPage = 20;
}
public int getLastVisibleItem(int[] lastVisibleItemPositions) {
int maxSize = 0;
for (int i = 0; i < lastVisibleItemPositions.length; i++) {
if (i == 0) {
maxSize = lastVisibleItemPositions[i];
} else if (lastVisibleItemPositions[i] > maxSize) {
maxSize = lastVisibleItemPositions[i];
}
}
return maxSize;
}
// This happens many times a second during a scroll, so be wary of the code you place here.
// We are given a few useful parameters to help us work out if we need to load some more data,
// but first we check if we are waiting for the previous load to finish.
@Override
public void onScrolled(RecyclerView view, int dx, int dy) {
int lastVisibleItemPosition = 0;
int totalItemCount = mLayoutManager.getItemCount();
if (mLayoutManager instanceof StaggeredGridLayoutManager) {
int[] lastVisibleItemPositions = ((StaggeredGridLayoutManager) mLayoutManager).findLastVisibleItemPositions(null);
// get maximum element within the list
lastVisibleItemPosition = getLastVisibleItem(lastVisibleItemPositions);
} else if (mLayoutManager instanceof GridLayoutManager) {
lastVisibleItemPosition = ((GridLayoutManager) mLayoutManager).findLastVisibleItemPosition();
} else if (mLayoutManager instanceof LinearLayoutManager) {
lastVisibleItemPosition = ((LinearLayoutManager) mLayoutManager).findLastVisibleItemPosition();
}
// If the total item count is zero and the previous isn't, assume the
// list is invalidated and should be reset back to initial state
if (totalItemCount < previousTotalItemCount) {
this.currentPage = this.startingPageIndex;
this.previousTotalItemCount = totalItemCount;
if (totalItemCount == 0) {
this.loading = true;
}
}
// If it’s still loading, we check to see if the dataset count has
// changed, if so we conclude it has finished loading and update the current page
// number and total item count.
if (loading && (totalItemCount > previousTotalItemCount)) {
loading = false;
previousTotalItemCount = totalItemCount;
}
// If it isn’t currently loading, we check to see if we have breached
// the visibleThreshold and need to reload more data.
// If we do need to reload some more data, we execute onLoadMore to fetch the data.
// threshold should reflect how many total columns there are too
if (!loading && (lastVisibleItemPosition + visibleThreshold) > totalItemCount) {
currentPage++;
onLoadMore(currentPage, totalItemCount, view);
loading = true;
}
}
// Call this method whenever performing new searches
public void resetState() {
this.currentPage = 0;
this.previousTotalItemCount = 0;
this.loading = true;
}
// Defines the process for actually loading more data based on page
public abstract void onLoadMore(int page, int totalItemsCount, RecyclerView view);
}