我希望通过调用页面编号增加的新JSON请求并在前面的结果中添加这些结果,在recyclerview
中实现无限滚动。第一个请求显示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);
}
}
}
EndlessRecyclerViewScrollListener.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);
}
答案 0 :(得分:2)
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
}
答案 1 :(得分:1)
rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (loading) {
if (mLayoutManager.findLastCompletelyVisibleItemPosition() == lastPosition) {
loading = false;
callUrlNext();
Log.v("...", "Last Item!");
}
}
}
});
在callUrlNext方法中你可以调用url.Then检查结果是否结束然后加载到false.First loading为真。