title: How to load more data in RecyclerView when Scrolling on Android
body: <p>I want develop android application for one website. I read website posts from <code>json</code> and show its in <code>RecyclerView</code> every 10 posts and when user scrolling on <code>RecyclerView</code> show more 10 post and go to end!<br>
  I am amateur and i write below codes, <strong>but I don't know</strong> to to read more data when scrolling and go to next page! (I want show any 10 posts in any pages).<br>
  <strong>Json link :</strong> <a href="http://tellfa.com/tafrihgah/?json=get_posts&amp;count=10&amp;page=1" rel="noreferrer">JSON LINK</a></p>
  
  <p><strong>AsyncTask codes:</strong></p>
  
  <pre><code>public class MainDataInfo {
      private Context mContext;
      private String ServerAddress = ServerIP.getIP();
  
      public void getMainDataInfo(Context context) {
          mContext = context;
          new getInfo().execute(ServerAddress + "page=1");
      }
  
      private class getInfo extends AsyncTask&lt;String, Void, String&gt; {
          EventBus bus = EventBus.getDefault();
          private String ou_response;
          private List&lt;MainDataModel&gt; infoModels;
  
          @Override
          protected void onPreExecute() {
              CustomProcessDialog.createAndShow(mContext);
              infoModels = new ArrayList&lt;&gt;();
          }
  
          @Override
          protected String doInBackground(String... params) {
              OkHttpClient client = new OkHttpClient();
  
              Request request = new Request.Builder()
                      .url(ServerAddress + "page=1")
                      .cacheControl(CacheControl.FORCE_NETWORK)
                      .build();
  
              Response response;
              try {
                  response = client.newCall(request).execute();
                  ou_response = response.body().string();
                  response.body().close();
                  if (ou_response != null) {
                      try {
                          JSONObject postObj = new JSONObject(ou_response);
                          JSONArray postsArray = postObj.optJSONArray("posts");
                          infoModels = new ArrayList&lt;&gt;();
  
                          for (int i = 0; i &lt;= infoModels.size(); i++) {
                              JSONObject postObject = (JSONObject) postsArray.get(i);
                              JSONObject images=postObject.optJSONObject("thumbnail_images");
                              JSONObject imagesPair=images.optJSONObject("medium");
  
                              int id = postObject.getInt("id");
                              String title = postObject.getString("title");
                              String content = postObject.getString("content");
                              String thumbnail = imagesPair.getString("url");
                              Log.d("Data", "Post id: " + id);
                              Log.d("Data", "Post title: " + title);
                              Log.d("Data", "Post title: " + thumbnail);
  
                              //Use the title and id as per your requirement
                              infoModels.add(new MainDataModel(id, title, content, thumbnail));
                          }
                      } catch (JSONException e) {
                          e.printStackTrace();
                      }
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
              return ou_response;
          }
  
          @Override
          protected void onPostExecute(String result) {
              CustomProcessDialog.dissmis();
              if (result != null) {
                  bus.post(infoModels);
              }
          }
      }
  }
  </code></pre>
  
  <p>I use this code for show any pages posts : <strong><code>ServerAddress + "page=1"</code></strong></p>
  
  <p><strong>Adapter codes:</strong></p>
  
  <pre><code>public class MainAdapter2 extends RecyclerView.Adapter {
  
      private List&lt;MainDataModel&gt; mDateSet;
      private Context mContext;
  
      private final int VIEW_ITEM = 1;
      private final int VIEW_PROG = 0;
  
      // The minimum amount of items to have below your current scroll position
      // before loading more.
      private int visibleThreshold = 5;
      private int lastVisibleItem, totalItemCount;
      private boolean loading;
      private OnLoadMoreListener onLoadMoreListener;
  
      public MainAdapter2(Context context, RecyclerView recyclerView, List&lt;MainDataModel&gt; dataSet) {
          this.mContext = context;
          this.mDateSet = dataSet;
  
          if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
  
              final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView
                      .getLayoutManager();
              recyclerView
                      .addOnScrollListener(new RecyclerView.OnScrollListener() {
                          @Override
                          public void onScrolled(RecyclerView recyclerView,
                                                 int dx, int dy) {
                              super.onScrolled(recyclerView, dx, dy);
                              totalItemCount = linearLayoutManager.getItemCount();
                              lastVisibleItem = linearLayoutManager
                                      .findLastVisibleItemPosition();
                              if (!loading
                                      &amp;&amp; totalItemCount &lt;= (lastVisibleItem + visibleThreshold)) {
                                  // End has been reached
                                  // Do something
                                  if (onLoadMoreListener != null) {
                                      onLoadMoreListener.onLoadMore();
                                  }
                                  loading = true;
                              }
                          }
                      });
          }
      }
  
      @Override
      public int getItemViewType(int position) {
          return mDateSet.get(position) != null ? VIEW_ITEM : VIEW_PROG;
      }
  
      @Override
      public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  
          RecyclerView.ViewHolder vh;
          if (viewType == VIEW_ITEM) {
              View v = LayoutInflater.from(parent.getContext()).inflate(
                      R.layout.post_card_layout, parent, false);
  
              vh = new DataViewHolder(v);
          } else {
              View v = LayoutInflater.from(parent.getContext()).inflate(
                      R.layout.progressbar_item, parent, false);
  
              vh = new ProgressViewHolder(v);
          }
          return vh;
      }
  
      @Override
      public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  
          if (holder instanceof DataViewHolder) {
              ((DataViewHolder) holder).main_post_title.setText(mDateSet.get(position).getTitle());
              Glide.with(mContext)
                      .load(mDateSet.get(position).getThumbnail())
                      .placeholder(R.drawable.post_image)
                      .crossFade()
                      .into(((DataViewHolder) holder).main_post_image);
              ((DataViewHolder) holder).main_post_content.setText(Html.fromHtml(mDateSet.get(position).getContent()));
  
          } else {
              ((ProgressViewHolder) holder).progressBar.setIndeterminate(true);
          }
      }
  
      public void setLoaded() {
          loading = false;
      }
  
      @Override
      public int getItemCount() {
          return mDateSet.size();
      }
  
      public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
          this.onLoadMoreListener = onLoadMoreListener;
      }
  
      public void remove(int position) {
          mDateSet.remove(position);
          notifyItemRemoved(position);
      }
  
      public void clear() {
          mDateSet.clear();
          notifyDataSetChanged();
      }
  
  
      public void add(List&lt;MainDataModel&gt; models) {
          mDateSet.addAll(models);
          notifyDataSetChanged();
      }
  
      public void update(List&lt;MainDataModel&gt; models) {
          mDateSet.clear();
          mDateSet.addAll(models);
          notifyDataSetChanged();
      }
  
      public class DataViewHolder extends RecyclerView.ViewHolder {
  
          private TextView main_post_title, main_post_content;
          private ImageView main_post_image;
  
          public DataViewHolder(View itemView) {
              super(itemView);
  
              main_post_title = (TextView) itemView.findViewById(R.id.post_content_title);
              main_post_image = (ImageView) itemView.findViewById(R.id.post_picture_image);
              main_post_content = (TextView) itemView.findViewById(R.id.post_content_text);
          }
      }
  
      public static class ProgressViewHolder extends RecyclerView.ViewHolder {
          public ProgressBar progressBar;
  
          public ProgressViewHolder(View v) {
              super(v);
              progressBar = (ProgressBar) v.findViewById(R.id.progressBar1);
          }
      }
  }
  </code></pre>
  
  <p><strong>MainActivity codes:</strong></p>
  
  <pre><code>public class Main_page extends AppCompatActivity {
  
      private static final long RIPPLE_DURATION = 250;
      private Toolbar toolbar;
      private RelativeLayout root;
      private ImageView menu_image;
      private RecyclerView main_recyclerView;
      private MainAdapter2 mAdaper;
      private List&lt;MainDataModel&gt; dataModels = new ArrayList&lt;MainDataModel&gt;();
      private List&lt;MainDataModel&gt; dataModelsArray;
      private Context context;
      protected Handler handler;
      private RelativeLayout loadLayout;
      private LinearLayoutManager mLayoutManager;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main_page);
          if (!EventBus.getDefault().isRegistered(this)) {
              EventBus.getDefault().register(this);
          }
          handler = new Handler();
          context = getApplicationContext();
          loadLayout = (RelativeLayout) findViewById(R.id.main_empty_layout);
          toolbar = (Toolbar) findViewById(R.id.main_toolbar);
          if (toolbar != null) {
              setSupportActionBar(toolbar);
              getSupportActionBar().setTitle(null);
          }
          LoadData();
          mLayoutManager = new LinearLayoutManager(this);
          // Menu
          root = (RelativeLayout) findViewById(R.id.main_root);
          View guillotineMenu = LayoutInflater.from(this).inflate(R.layout.menu_layout, null);
          root.addView(guillotineMenu);
          menu_image = (ImageView) toolbar.findViewById(R.id.toolbar_logo);
          new GuillotineAnimation.GuillotineBuilder(guillotineMenu, guillotineMenu.findViewById(R.id.menu_layout_image), menu_image)
                  .setStartDelay(RIPPLE_DURATION)
                  .setActionBarViewForAnimation(toolbar)
                  .setClosedOnStart(true)
                  .build();
          // RecyclerView and setData
          main_recyclerView = (RecyclerView) findViewById(R.id.main_recycler);
          main_recyclerView.setHasFixedSize(true);
          main_recyclerView.setLayoutManager(mLayoutManager);
  
          mAdaper = new MainAdapter2(this, main_recyclerView, dataModels);
          main_recyclerView.setAdapter(mAdaper);
  
          mAdaper.setOnLoadMoreListener(new OnLoadMoreListener() {
              @Override
              public void onLoadMore() {
  
              }
          });
  
  
      }
  
  
      @Subscribe
      public void onEvent(List&lt;MainDataModel&gt; mainInfoModels) {
          mAdaper.add(mainInfoModels);
  
          if (dataModels.isEmpty()) {
              main_recyclerView.setVisibility(View.GONE);
              loadLayout.setVisibility(View.VISIBLE);
  
          } else {
              main_recyclerView.setVisibility(View.VISIBLE);
              loadLayout.setVisibility(View.GONE);
          }
      }
  
      private void LoadData() {
          final MainDataInfo dataInfo = new MainDataInfo();
          dataInfo.getMainDataInfo(this);
      }
  </code></pre>
  
  <p>for load more data i use <strong>Interface</strong> class : <code>OnLoadMoreListener</code></p>
  
  <p><strong>Attention :</strong> I know the name of this method is endless! but i am amateur and i don't know to write code in <code>mAdapter.setOnMoreListener</code> to load more data! Please don't give me negative points, help me and i really need you helps! thanks all &lt;3</p>