无尽的Recyclerview监听器重新加载同一页面

时间:2019-01-16 21:00:34

标签: java android

我有一个从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);

}

0 个答案:

没有答案