2017-03-24 1 views
0

나는 리사이클 러를 가지고 있으며 내부에 REST 서비스에서 정보를 가져 오는 cardview가 있으며 끝없는 스크롤을 구현하려고하는데, 더 이상 없을 때까지 스크롤 할 때마다 10 개의 cardviews가 표시된다고 가정합니다 표시 할 cardviews, 어떻게 그것을 얻을 수 있습니까?RecyclerView를 사용하여 무한 스크롤을 구현하는 방법은 무엇입니까?

몇 가지 예를 살펴 보았지만 그 중 아무도 실제로 어떻게해야하는지에 대해 전혀 도움이되지 않았습니다. 나는 어댑터를 구현하는 방법을 이해하지 못하기 때문에 adapter.class 나 Fragment.class에 무엇을 넣어야하는지조차 알지 못한다. 누군가가 나에게 무한 스크롤을 구현하는 올바른 방법을 말해 줄 수 있다면 좋을 것이다. 내 코드 ...

미리 감사드립니다.

MainAdapter.class

public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> implements View.OnClickListener 
{ 
    private ArrayList<Business> businessList; 
    private Activity activity; 
    private int layoutMolde,idb; 

    public MainAdapter(Activity activity, ArrayList<Business> list, int layout) 
    { 
     this.activity = activity; 
     this.businessList = list; 
     layoutMolde = layout; 
    } 

    @Override 
    public MainAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_row, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) 
    { 
     holder.mTitle.setText(businessList.get(position).getBusiness_name()); 
     holder.number_rating.setText(businessList.get(position).getRating().toString()); 
     Glide.with(activity).load(businessList.get(position).getLogo_url_string()).into(holder.mImg); 
    } 

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

    @Override 
    public void onClick(View v) 
    { 

    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 

     public TextView mTitle; 
     public ImageView mImg; 
     public ImageView logo; 
     public RatingBar main_rating; 
     public TextView number_rating; 

     public ViewHolder(View itemView) 
     { 
      super(itemView); 
      mTitle = (TextView) itemView.findViewById(R.id.nom_business_main); 
      number_rating = (TextView) itemView.findViewById(R.id.number_rating); 
      mImg = (ImageView) itemView.findViewById(R.id.img_main); 
      main_rating=(RatingBar) itemView.findViewById(R.id.rating_main); 
      main_rating.setRating((float)1); 
      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) 
       { 

        Intent in = new Intent(v.getContext(), BusinessPremium.class); 
        int position = getAdapterPosition(); 
        idb = businessList.get(position).getId(); 
        in.putExtra("no", idb); 
        v.getContext().startActivity(in); 
       } 
      }); 
     } 
    } 
} 

FeedsFragment.class

public class FeedsFragment extends Fragment 
    { 

     private ArrayList<Business> arrayBusiness,arrayBasics; 
     private Gson gson; 

     private static final Type BUSINESS_TYPE = new TypeToken<ArrayList<Business>>() {}.getType(); 
     private RecyclerView.LayoutManager mLayoutManager; 

     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      View android = inflater.inflate(R.layout.fragment_feeds, container, false); 

      if (!internetConnectionCheck(FeedsFragment.this.getActivity())) 
      { 
       Toast.makeText(getApplicationContext(), "Error de Conexión", Toast.LENGTH_LONG).show(); 
      } 

      new RequestBase(getActivity()) { 

       @Override 
       public JsonObject onHttpOk(JsonObject response) throws JSONException { 

        JsonObject objeto, pagination_details = null, details, premium_img; 
        JsonArray data; 

        if (getActivity() == null) 
         return response; 

        if (response.get("pagination") == null) 
        { 
         objeto = response; 

        } else { 
         objeto = response; 
         pagination_details = response.get("pagination").getAsJsonObject(); 
         data = objeto.get("data").getAsJsonArray(); 
         gson = new Gson(); 
         arrayBusiness = gson.fromJson(data, BUSINESS_TYPE); 
         Log.d("size", String.valueOf(arrayBusiness.size())); 
         FeedsFragment.this.getActivity().runOnUiThread(new Runnable() 
         { 
          @Override 
          public void run() 
          { 

           RecyclerView recycler = (RecyclerView) FeedsFragment.this.getActivity().findViewById(R.id.recycler_main); 
           MainAdapter adapter = new MainAdapter(getActivity(), arrayBusiness, R.layout.main_row); 

           recycler.setNestedScrollingEnabled(false); 
           mLayoutManager = new GridLayoutManager(FeedsFragment.this.getActivity(), 2); 
           recycler.setLayoutManager(mLayoutManager); 
           recycler.setAdapter(adapter); 

           GifTextView loading = (GifTextView)FeedsFragment.this.getActivity().findViewById(R.id.loading); 
           TextView loadingText = (TextView)FeedsFragment.this.getActivity().findViewById(R.id.loadingText); 
           loading.setVisibility(View.GONE); 
           loadingText.setVisibility(View.GONE); 

          } 
         }); 
        } 
        if (pagination_details.isJsonNull()) { 
         Log.d("Paginacion", pagination_details.toString()); 
        } 
        return objeto; 
       } 

       @Override 
       public void onHttpCreate(JsonObject response) throws JSONException 
       { 

       } 

       @Override 
       public void onHttpUnprocessableEntity(JsonObject response) throws JSONException 
       { 
        this.cancel(true); 
        final String error = response.get("errors").toString(); 
        getActivity().runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Toast.makeText(getActivity().getApplicationContext(), error, Toast.LENGTH_LONG).show(); 
         } 
        }); 
       } 
      }.execute("businesses/premiums", "GET"); 

      return android; 
     } 
} 
+0

scrollview 대신 nestedscrollview 사용 –

답변

1
당신이 새로 안드로이드에 SwipeRefreshLayout를 사용하여 새로 고칠 수 있습니다

과에 새로 고침 재정의 메서드에

당신의 API 호출

메모 : API 호출 요청을 메소드 및 cal에 넣습니다. 그 방법에 대해 SwipeRefreshLayout의 새로 고침 메서드

0

recyclerview에 scrollListener을 추가 할 수 있습니다. scrollListener 정확하게 (당신이 유연하게 쓸 수 있습니다) 일부 논리에 따라 recyclerview에서 당신을하고 위치를 확인합니다,

체크 비슷한 대답 here

그리고 주요 SO here

를 게시 할 수 있도록 두 번째 전화!

0

"ready"라는 정적 부울 변수를 만들고이를 false로 초기화하십시오.

다음과 같이 onLoadMore 메서드에서 if 준비 조건을 추가합니다.

public boolean onLoadMore(int page, int totalItemsCount) { 
     if (ready) { 
      //load more from API 
     }   
    return false; 
} 

항목의 위치가 마지막 일 때 onBindViewHolder에서 true로 설정됩니다.

1

RecyclerView.Adapter으로 작성하는 경우 올바른 항목 수 (큰 수 있음)를 반환하는 getItemCount 메서드를 제공해야합니다. RecyclerView는이 어댑터의 onBindViewHolder (홀더, 위치) 메소드를 자체적으로 호출합니다. 이 위치와 관련된 데이터 검색 기능을 제공하면됩니다. 목록이 화면보다 작 으면 화면 또는 Integer.MAX_VALUE 크기보다 약간 큰 차이는 없습니다. RecyclerView는 너무 많은 추가 항목을 가져 오거나 할당하지 않도록주의를 기울입니다.

스크롤 리스너를 구현하거나 명시 적으로 스크롤을 처리하는 하지 필요성을한다.

유일한 까다로운 부분은 서버 호출과 같은 긴 작업을 수행하여 일부 항목을 가져와야 할 수도 있다는 것입니다. 그런 다음 첫 번째 호출에서 초기화되지 않은 홀더 (빈보기)를 반환하고 백그라운드 스레드에서 필요한 행을 가져 오기 시작합니다.가지고있을 때는 notifyDataSetChanged 또는 notifyItemRangeChanged으로 전화하면 RecyclerView가 자동으로 업데이트됩니다.

성능상의 이유로 표시되는 모든 행마다 개별적인 서버 요청을 보내는 것이 아니라 고정 된 크기의 청크로 콘텐츠를 업데이트하는 것이 좋습니다. Google 도서와 같은 일부 공개 서버의 경우 요청 당 할당량 한도가 이므로이 요구 사항이 분명히 필요합니다..

구현 방법에 대한 전체 소스 코드를 보려면 open source project here in GitHub이 필요합니다.

관련 문제