我想在recyclerview中实现无休止的滚动,方法是调用新的json请求并增加页码,然后将这些结果与前面的结果相加。第一个请求显示20个结果,但还有200多个结果要显示。我怎么能有无休止的滚动onLoadMore()功能
topratedFragment.java

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.JsonObjectRequest;
import com.example.mitab.mentor.Movies.Pages.L;
import com.example.mitab.mentor.Movies.Pages.MyApplication;
import com.example.mitab.mentor.Movies.Pages.VolleySingleton;
import com.example.mitab.mentor.Movies.Pages.movie;
import com.example.mitab.mentor.R;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import android.os.Handler;

import static com.example.mitab.mentor.Movies.Pages.Keys.EndpointToprated.*;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link TopratedFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class TopratedFragment extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
    public static final String Top_rated="http://api.themoviedb.org/3/movie/top_rated";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;
    protected Handler handler;
    private VolleySingleton volleySingleton;
    private ImageLoader imageLoader;
    int page=1;
    private RequestQueue requestQueue;
    private ArrayList<movie> listMovies=new ArrayList<>();
    private SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
    private RecyclerView listMovieHits;
    private AdapterToprated adapterToprated;


    public TopratedFragment() {
        // Required empty public constructor
    }

    // TODO: Rename and change types and number of parameters
    public static TopratedFragment newInstance(String param1, String param2) {
        TopratedFragment fragment = new TopratedFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }

        volleySingleton= VolleySingleton.getsInstance();
        requestQueue=volleySingleton.getRequestQueue();

        sendJsonRequest();
    }

    private void sendJsonRequest(){
        JsonObjectRequest request=new JsonObjectRequest(Request.Method.GET, getRequestUrl(page), (String)null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                listMovies=parseJSONResponse(response);
                adapterToprated.setMovieList(listMovies);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
        requestQueue.add(request);
    }

    private ArrayList<movie> parseJSONResponse(JSONObject response){
        ArrayList<movie> listMovies=new ArrayList<>();
        if (response==null || response.length()>0){



            try {
                JSONArray arrayMovies=response.getJSONArray(KEY_MOVIES);
                for (int i=0;i<arrayMovies.length();i++){

                    long id=-1;
                    String title="NA";
                    String poster="NA";
                    String release="NA";
                    String overview="NA";
                    String vote="NA";
                    String votecount="NA";

                    JSONObject currentMovie=arrayMovies.getJSONObject(i);

                    //get the id of current movie
                    if (currentMovie.has(KEY_ID)&& !currentMovie.isNull(KEY_ID)){
                        id=currentMovie.getLong(KEY_ID);
                    }

                    if (currentMovie.has(KEY_TITLE)&& !currentMovie.isNull(KEY_TITLE)){
                        title=currentMovie.getString(KEY_TITLE);
                    }

                    if (currentMovie.has(KEY_POSTER_PATH)&& !currentMovie.isNull(KEY_POSTER_PATH)){
                        poster=currentMovie.getString(KEY_POSTER_PATH);
                    }

                    if (currentMovie.has(KEY_RELEASE_DATE)&& !currentMovie.isNull(KEY_RELEASE_DATE)){
                        release=currentMovie.getString(KEY_RELEASE_DATE);
                    }

                    if (currentMovie.has(KEY_OVERVIEW)&& !currentMovie.isNull(KEY_OVERVIEW)){
                        overview=currentMovie.getString(KEY_OVERVIEW);
                    }

                    if (currentMovie.has(KEY_AVERAGE_VOTE)&& !currentMovie.isNull(KEY_AVERAGE_VOTE)){
                        vote=currentMovie.getString(KEY_AVERAGE_VOTE);
                    }

                    if (currentMovie.has(KEY_VOTE_COUNT)&& !currentMovie.isNull(KEY_VOTE_COUNT)){
                        votecount=currentMovie.getString(KEY_VOTE_COUNT);
                    }







                    JSONArray genre=currentMovie.getJSONArray(KEY_GENRE_IDS);

                    if (currentMovie.has(KEY_GENRE_IDS)&& !currentMovie.isNull(KEY_GENRE_IDS)){
                        for (int j=0;j<genre.length();j++){
                            try {
                                String itemInArray=genre.getString(j);

                            }
                            catch (JSONException e){

                            }
                        }
                    }


                    movie movie=new movie();
                    movie.setId(id);
                    movie.setTitle(title);
                    movie.setOverview(overview);
                    movie.setAveragevote(vote);
                    Date date=null;
                    try {
                        date=dateFormat.parse(release);
                    }
                    catch (ParseException e){

                    }

                    movie.setReleasedate(date);
                    movie.setImage(poster);
                    movie.setVotecount(votecount);

                    if (id!=-1 && !title.equals("NA"))
                    {
                        listMovies.add(movie);
                    }


                }



            }
            catch (JSONException e){

            }
        }
        return listMovies;
    }

    public static String getRequestUrl(int page){
        return Top_rated +"?api_key="+ MyApplication.API_KEY + "&page="+page;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_toprated, container, false);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
        handler=new Handler();
        listMovieHits=(RecyclerView) view.findViewById(R.id.listMovieHits);
        listMovieHits.setLayoutManager(linearLayoutManager);

        adapterToprated=new AdapterToprated(getActivity());
        listMovieHits.setAdapter(adapterToprated);
        sendJsonRequest();
        // Add the scroll listener
        listMovieHits.addOnScrollListener(new EndlessRecyclerViewScrollListener(linearLayoutManager) {
            @Override
            public void onLoadMore(int current_page) {
                // fetch data asynchronously here
                listMovies.add(null);
                adapterToprated.notifyItemInserted(listMovies.size());

                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        listMovies.remove(listMovies.size() - 1);
                        adapterToprated.notifyItemRemoved(listMovies.size());
                        //add items one by one

                        for (int i = 0; i < 5; i++) {
                            page=page+1;
                            listMovies.add(new movie());
                            sendJsonRequest();
                            adapterToprated.notifyItemInserted(listMovies.size());


                        }
                            //adapterToprated.setMovieList();
//                    adapterToprated.setMovieList(listMovies);
//                    adapterToprated.notifyDataSetChanged();


                }
            }

            ,2000);

//                int curSize = adapterToprated.getItemCount();
//                adapterToprated.notifyItemRangeChanged(curSize, listMovies.size() + 1);
//                page = current_page;
                //sendJsonRequest();

            }
        });
        // Inflate the layout for this fragment
        return view;
    }


}

adaptertoprated.java语言
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.example.mitab.mentor.MainActivity;
import com.example.mitab.mentor.Movies.Pages.L;
import com.example.mitab.mentor.Movies.Pages.VolleySingleton;
import com.example.mitab.mentor.Movies.Pages.movie;
import com.example.mitab.mentor.R;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 * Created by Mitab on 1/15/2016.
 */
public class AdapterToprated extends RecyclerView.Adapter<AdapterToprated.ViewHolderToprated> {

    private LayoutInflater layoutInflater;
    private VolleySingleton volleySingleton;
    private ImageLoader imageLoader;
    private ArrayList<movie> listMovies=new ArrayList<movie>();
    private SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
    private RecyclerView.OnItemTouchListener onItemTouchListener;
    Context context;



    public AdapterToprated(Context context){
        layoutInflater=LayoutInflater.from(context);
        volleySingleton=VolleySingleton.getsInstance();
        imageLoader=volleySingleton.getImageLoader();
        this.context = context;
    }

    public void setMovieList(ArrayList<movie> listMovies){
        this.listMovies=listMovies;
        notifyItemRangeChanged(0, listMovies.size());
    }
    @Override
    public ViewHolderToprated onCreateViewHolder(ViewGroup parent, int viewType) {
        View view=layoutInflater.inflate(R.layout.individual_toprated, parent, false);
        ViewHolderToprated viewHolderToprated=new ViewHolderToprated(view);
        return viewHolderToprated;
    }

    @Override
    public void onBindViewHolder(final ViewHolderToprated holder, int position) {
        final movie currentMovie=listMovies.get(position);
        holder.movieTitle.setText(currentMovie.getTitle());
        Date movieReleaseDate=currentMovie.getReleasedate();
        if (movieReleaseDate!=null){
            String formattedDate=dateFormat.format(movieReleaseDate);
            holder.movieReleaseDate.setText(formattedDate);
        }else{
            holder.movieReleaseDate.setText("NA");
        }

        holder.movieRating.setText(currentMovie.getAveragevote());
        String urlThumnail=currentMovie.getImage();
        if (!urlThumnail.equals("NA")){
            imageLoader.get(urlThumnail, new ImageLoader.ImageListener() {
                @Override
                public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
                    holder.movieThumbnail.setImageBitmap(response.getBitmap());
                }

                @Override
                public void onErrorResponse(VolleyError error) {

                }
            });
        }
        holder.lnrLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(context,Intentpass.class);
                Bundle extras=new Bundle();
                extras.putString("Title","currentMovie.getTitle()");
                extras.putString("Date","formattedDate");
                extras.putString("Rating","currentMovie.getAveragevote()");
                intent.putExtras(extras);
                context.startActivity(intent);
                //intent.putExtra("details",currentMovie.getTitle());
                //context.startActivity(intent);

            }
        });


    }

    @Override
    public int getItemCount() {
        return listMovies.size();
    }

    static class ViewHolderToprated extends RecyclerView.ViewHolder{

        private ImageView movieThumbnail;
        private TextView movieTitle;
        private TextView movieReleaseDate;
        private TextView movieRating;
        private RelativeLayout lnrLayout;

        public ViewHolderToprated(View itemView) {
            super(itemView);
            movieThumbnail=(ImageView) itemView.findViewById(R.id.movieThumbnail);
            movieTitle=(TextView) itemView.findViewById(R.id.movieTitle);
            movieReleaseDate=(TextView) itemView.findViewById(R.id.movieReleaseDate);
            movieRating=(TextView) itemView.findViewById(R.id.movieRating);
            lnrLayout=(RelativeLayout)itemView.findViewById(R.id.lnLayout);
        }
    }
}

endlessRecycleServiceScrollListener.java
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

public abstract class EndlessRecyclerViewScrollListener extends RecyclerView.OnScrollListener {
    public static String TAG = EndlessRecyclerViewScrollListener.class.getSimpleName();

    private int previousTotal = 0; // The total number of items in the dataset after the last load
    private boolean loading = true; // True if we are still waiting for the last set of data to load.
    private int visibleThreshold = 5; // The minimum amount of items to have below your current scroll position before loading more.
    int firstVisibleItem, visibleItemCount, totalItemCount;

    private int current_page = 2;

    private LinearLayoutManager mLinearLayoutManager;

    public EndlessRecyclerViewScrollListener(LinearLayoutManager linearLayoutManager) {
        this.mLinearLayoutManager = linearLayoutManager;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        visibleItemCount = recyclerView.getChildCount();
        totalItemCount = mLinearLayoutManager.getItemCount();
        firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();

        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
            }
        }
        if (!loading && (totalItemCount - visibleItemCount)
                <= (firstVisibleItem + visibleThreshold)) {
            // End has been reached

            // Do something
            current_page++;

            onLoadMore(current_page);

            loading = true;
        }
    }

    public abstract void onLoadMore(int current_page);
}

最佳答案

    public class MySalesFragment extends Fragment {

        private RecyclerView recyclerView;
        private LinearLayoutManager layoutManager;
        private String TAG = MySalesFragment.class.getSimpleName();
        private int pastVisiblesItems, visibleItemCount, totalItemCount, lastVisibleItemId;
        boolean loadingMore = false;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_my_sales, container, false);
            return view;
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            InItViews();
        }

        private void InItViews() {

            mySaleArraylist = new LinkedList<>();

            recyclerView = (RecyclerViewEmptySupport) getActivity().findViewById(R.id.recyclerView_my_sales);
            recyclerView.setHasFixedSize(true);
            layoutManager = new LinearLayoutManager(getActivity());
            layoutManager.setOrientation(LinearLayout.VERTICAL);
            recyclerView.setLayoutManager(layoutManager);
            recyclerView.setItemAnimator(new DefaultItemAnimator());

            recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                }

                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);

                    lastVisibleItemId = layoutManager.findLastVisibleItemPosition();

                    if (lastVisibleItemId==mySaleArraylist.size()-1 && !loadingMore){
                        Logg.e("lastVisibleItemId==>",lastVisibleItemId);
                        Logg.e("onScrollStateChanged==>", "Last Item Wow !" + mySaleArraylist.get(lastVisibleItemId).getSaleId() + "carname==" + mySaleArraylist.get(lastVisibleItemId).getCarDetail().getCarModel());
                        loadMoreData(lastVisibleItemId);
                    }
                }
            });
        }

private void loadMoreData(int lastVisibleItemId) {
        loadingMore=true;
        callYourURL();  // and on success response set loadingMore=false and add your data in in last position in your arraylist
    }

10-04 13:59