2016-01-28 3 views
2

Я хочу реализовать бесконечную прокрутку в recyclerview, вызвав новый запрос JSON с увеличением номера страницы и добавлением результата с предыдущими результатами. первый запрос показывает 20 результатов, но есть 200+ результаты слева show.How я могу иметь бесконечный свиток onLoadMore() функцияБесконечная прокрутка в recyclerview по запросу Json

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); 
} 

ответ

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 нагрузки верно.

+0

Спасибо за помощь ур .И я довольно новыми для Android и когда я вставил свой код он показывает «не может разрешить символ» при погрузке и mLayoutManager.Can пожалуйста simplify.Do мне нужно импортировать что-то или объявлять переменные? –

+0

LinearLayoutManager mLayoutManager = новый LinearLayoutManager (this) rv.setLayoutManager (mLayoutManager); mLayoutManager - менеджер компоновки RecyclerViews. –

+0

Я заменил ваш «lastPosition» на 20 и «callUrlNext()» с помощью sendJsonRequest(). Но я не могу получить бесконечный прокрутка. Вы можете помочь мне PLZ? –

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 
    } 
+0

Что такое RecyclerViewEmptySupport recyclerView, объявленное как переменная? Coz его отображение ошибки, когда я вставляю его. «Не удается разрешить символ» –

+1

Это мое настроенное recyclerview, вы можете заменить «RecyclerViewEmptySupport» на «RecyclerView». – Bhavnik

+0

Я использовал ваш код, и мое приложение разбилось, а logcat - java.lang.NullPointerException: попытка вызвать виртуальный метод 'int android.support.v7.widget.LinearLayoutManager.findLastVisibleItemPosition()' в ссылке нулевого объекта на "lastVisibleItemId = layoutManager .findLastVisibleItemPosition();» Plz помогите мне –

Смежные вопросы