2017-06-17 5 views
1

私はrecyclerviewを持っており、このpopular android Endless scroll Libraryでエンドレススクロールを実装しようとしています。現在のリストのbuttomに到達すると、最後に表示されていたアイテムから継続するのではなく、上からリロードして開始します。Recyclerviewエンドレススクロールリロードページonscroll

これは私のScroll Listernerです。

scrollListener = new EndlessRecyclerViewScrollListener(manager) { 
     @Override 
     public void onLoadMore(int page, int totalItemsCount, RecyclerView view) { 
      // Triggered only when new data needs to be appended to the list 
      // Add whatever code is needed to append new items to the bottom of the list 
      loadMore(page); 
      ++page; 
     } 
    }; 

    mRecyclerView.addOnScrollListener(scrollListener); 

これは私のloadMore(ある)

public void loadMore(int page) { 

    String url = myurl + page; 
    StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      //Log.i("Responses", response); 
      ArrayList<Deal> deals = new JsonConverter<Deal>().toArrayList(response, Deal.class); 
      dealArrayList.addAll(deals); 
      adapter = new DealAdapter(getApplicationContext(), dealArrayList); 
      mRecyclerView.setAdapter(adapter); 
      newList = deals; 
      adapter.notifyItemRangeInserted(newList.size(), dealArrayList.size()); 
      stopAnim(); 


     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.d(TAG, error.toString()); 
      Toast.makeText(getApplicationContext(), "Bad Network Connection. Please Try Again", Toast.LENGTH_LONG).show(); 
      stopAnim(); 

     } 
    } 
    ); 

    int socketTimeout = 30000; // 30 seconds. You can change it 
    RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, 
      DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
      DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 

    stringRequest.setRetryPolicy(policy); 
    MySingleton.getInstance(getApplicationContext()).addToRequestQueue(stringRequest); 
    mSwipeRefresh.setRefreshing(false); 


} 

いただきました!間違って私が把握することはできません。 ヘルプ。

編集済み 私のアプリは、最初にランチしてからスクロールするときにloadMore関数を呼び出すときに、この関数を呼び出します。

public void firstRun(int page) { 

    String url = myurl + page; 
    StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      Log.i("Responses", response); 
      dealArrayList = new JsonConverter<Deal>().toArrayList(response, Deal.class); 
      adapter = new DealAdapter(getApplicationContext(), dealArrayList); 
      mRecyclerView.setAdapter(adapter); 
      newList = dealArrayList; 
      adapter.notifyDataSetChanged(); 
      stopAnim(); 


     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.d(TAG, error.toString()); 
      Toast.makeText(getApplicationContext(), "Bad Network Connection. Please Try Again", Toast.LENGTH_LONG).show(); 
      stopAnim(); 

     } 
    } 
    ); 

    int socketTimeout = 30000; // 30 seconds. You can change it 
    RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, 
      DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
      DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 

    stringRequest.setRetryPolicy(policy); 
    MySingleton.getInstance(getApplicationContext()).addToRequestQueue(stringRequest); 
    mSwipeRefresh.setRefreshing(false); 


} 

これは私のアダプター編集

public class DealAdapter extends RecyclerView.Adapter<DealAdapter.ViewHolder> { 
private Context context; 
private ArrayList<Deal> deals; 

public DealAdapter(Context context, ArrayList<Deal> deals) { 
    this.context = context; 
    this.deals = deals; 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    View view = inflater.inflate(R.layout.card_view, parent, false); 
    final ViewHolder holder = new ViewHolder(view); 


    return holder; 
} 

@Override 
public void onBindViewHolder(final ViewHolder holder, int position) { 
    Deal deal = deals.get(position); 
    holder.mCardTitle.setText(deal.title); 
    holder.mCardLocation.setText(deal.location); 
    holder.mCardDiscount.setText(String.valueOf(deal.discount)); 
    holder.mCardPrice.setText(deal.price); 
    holder.mCardContact.setText(deal.contact); 
    holder.mCardDescription.setText(deal.description); 
    String url = myurl + deal.image; 
    Picasso.with(context) 
      .load(url).resize(0,300) 
      .placeholder(R.drawable.load) 
      .error(android.R.drawable.stat_notify_error) 
      .into(holder.mCardImage); 


    holder.mCardDescription.setOnClickListener(new View.OnClickListener() { 
     boolean isClicked = false; 
     @Override 
     public void onClick(View v) { 
      if(isClicked){ 
       //This will shrink textview to 2 lines if it is expanded. 
       holder.mCardDescription.setMaxLines(2); 
       holder.more.setVisibility(View.VISIBLE); 
       holder.mCardInvisible.setVisibility(View.GONE); 
       isClicked = false; 
      } else { 
       //This will expand the textview if it is of 2 lines 
       holder.mCardDescription.setMaxLines(Integer.MAX_VALUE); 
       holder.more.setVisibility(View.GONE); 
       holder.mCardInvisible.setVisibility(View.VISIBLE); 
       isClicked = true; 
      } 
     } 
    }); 

} 

@Override 
public int getItemCount() { 
    if (deals != null) { 
     return deals.size(); 
    }else{ 
     return 0; 
    } 
} 

static class ViewHolder extends RecyclerView.ViewHolder { 

    private TextView mCardTitle; 
    private ImageView mCardImage; 
    private TextView mCardLocation; 
    private TextView mCardDescription; 
    private TextView mCardContact; 
    private TextView mCardPrice; 
    private TextView mCardDiscount, more; 
    private LinearLayout mCardInvisible; 

    private ViewHolder(View itemView) { 
     super(itemView); 
     mCardTitle = (TextView) itemView.findViewById(R.id.mCardTitle); 
     mCardImage = (ImageView) itemView.findViewById(R.id.mCardImage); 
     mCardLocation = (TextView) itemView.findViewById(R.id.mCardLocation); 
     mCardDescription = (TextView) itemView.findViewById(R.id.mCardDescription); 
     mCardContact = (TextView) itemView.findViewById(R.id.mCardContact); 
     mCardPrice = (TextView) itemView.findViewById(R.id.mCardPrice); 
     mCardDiscount = (TextView) itemView.findViewById(R.id.mCardDiscount); 
     more = (TextView) itemView.findViewById(R.id.mCardMore); 
     mCardInvisible = (LinearLayout) itemView.findViewById(R.id.mCardInvisible); 

    } 


} 

}

です::あなたのアダプタでこれが私のOnRefreshリスナーである

mSwipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
      new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        firstRun(1); 
       } 
      }, 3000); 

     } 
    }); 
+0

あなたは 'アダプター=新しいDealAdapter(getApplicationContext()、dealArrayList)を設定している;'毎回あなたが底に達し、あなたは一度アダプタを初期化する必要があります余分なアイテムを追加するだけです。 – Akis

+0

私はそのコード行をonCreate関数に移動しましたが、まだ同じです –

+0

'mRecyclerView.setAdapter(アダプター);'も一度設定する必要があります – Akis

答えて

1

は、データにあなたをマージし、新しい機能を追加します新しいものと持っている:

public void addAll(List data){ 
    deals.addAll(data); 
    notifyDataSetChanged(); 
} 

あなたloadMore機能でonResponseは、次のようになります。

public void onResponse(String response) { 
    //Log.i("Responses", response); 
    ArrayList<Deal> deals = new JsonConverter<Deal>().toArrayList(response, Deal.class); 
    adapter.addAll(deals); 
    stopAnim(); 
} 
+0

それは働いた..非常に感謝..非常に小さな問題。アクティビティをリフレッシュすると、onScrollはもうロードされません。 Onrefresh、私はfirstRun関数を呼び出します –

+1

私のonRefresh Listenerのコードを追加しました –

+0

@MaxBillionaireは、あなたが今持っているものとあなたのコードを更新します。また、Onrefreshコード – Akis