Set DataSource size in PageKeyedDataSource to get placeholder effect












2















I am using the Paging Library from Android Architecture Component. I am trying to load data through server, without any local database.



My DataSource class extends PageKeyedDataSource.



Below is my Paging.Config customisation,



PagedList.Config pageConfig = (new PagedList.Config.Builder())
.setPageSize(20)
.setInitialLoadSizeHint(30)
.setPrefetchDistance(5)
.setEnablePlaceholders(true)
.build();


I have enabled placeholders & that lands me to managing null in
PagedListAdapter class. I have done that something like below,



@Override
public void onBindViewHolder(@NonNull MyEventViewHolder holder, int position) {
Article mArticle = getItem(position);

if (mArticle != null) {
holder.txtTitle.setText(mArticle.getTitle());
holder.txtAuthor.setText(mArticle.getAuthor());
holder.txtDesc.setText(mArticle.getDescription());
} else {
holder.txtTitle.setText("...");
holder.txtAuthor.setText("......");
holder.txtDesc.setText(".........");
}
}


I am unable to see placeholders at the end of a list before next API call.



My question is, Is there a way that I can specify the size of list after first API call? As my API is returning total number of items to be expected from the query. If not possible that what else I can do to see placeholders for my list.



Note : I cannot switch to ItemKeyedDataSource or PositionalDataSource because my API is set to respond on page basis.










share|improve this question



























    2















    I am using the Paging Library from Android Architecture Component. I am trying to load data through server, without any local database.



    My DataSource class extends PageKeyedDataSource.



    Below is my Paging.Config customisation,



    PagedList.Config pageConfig = (new PagedList.Config.Builder())
    .setPageSize(20)
    .setInitialLoadSizeHint(30)
    .setPrefetchDistance(5)
    .setEnablePlaceholders(true)
    .build();


    I have enabled placeholders & that lands me to managing null in
    PagedListAdapter class. I have done that something like below,



    @Override
    public void onBindViewHolder(@NonNull MyEventViewHolder holder, int position) {
    Article mArticle = getItem(position);

    if (mArticle != null) {
    holder.txtTitle.setText(mArticle.getTitle());
    holder.txtAuthor.setText(mArticle.getAuthor());
    holder.txtDesc.setText(mArticle.getDescription());
    } else {
    holder.txtTitle.setText("...");
    holder.txtAuthor.setText("......");
    holder.txtDesc.setText(".........");
    }
    }


    I am unable to see placeholders at the end of a list before next API call.



    My question is, Is there a way that I can specify the size of list after first API call? As my API is returning total number of items to be expected from the query. If not possible that what else I can do to see placeholders for my list.



    Note : I cannot switch to ItemKeyedDataSource or PositionalDataSource because my API is set to respond on page basis.










    share|improve this question

























      2












      2








      2








      I am using the Paging Library from Android Architecture Component. I am trying to load data through server, without any local database.



      My DataSource class extends PageKeyedDataSource.



      Below is my Paging.Config customisation,



      PagedList.Config pageConfig = (new PagedList.Config.Builder())
      .setPageSize(20)
      .setInitialLoadSizeHint(30)
      .setPrefetchDistance(5)
      .setEnablePlaceholders(true)
      .build();


      I have enabled placeholders & that lands me to managing null in
      PagedListAdapter class. I have done that something like below,



      @Override
      public void onBindViewHolder(@NonNull MyEventViewHolder holder, int position) {
      Article mArticle = getItem(position);

      if (mArticle != null) {
      holder.txtTitle.setText(mArticle.getTitle());
      holder.txtAuthor.setText(mArticle.getAuthor());
      holder.txtDesc.setText(mArticle.getDescription());
      } else {
      holder.txtTitle.setText("...");
      holder.txtAuthor.setText("......");
      holder.txtDesc.setText(".........");
      }
      }


      I am unable to see placeholders at the end of a list before next API call.



      My question is, Is there a way that I can specify the size of list after first API call? As my API is returning total number of items to be expected from the query. If not possible that what else I can do to see placeholders for my list.



      Note : I cannot switch to ItemKeyedDataSource or PositionalDataSource because my API is set to respond on page basis.










      share|improve this question














      I am using the Paging Library from Android Architecture Component. I am trying to load data through server, without any local database.



      My DataSource class extends PageKeyedDataSource.



      Below is my Paging.Config customisation,



      PagedList.Config pageConfig = (new PagedList.Config.Builder())
      .setPageSize(20)
      .setInitialLoadSizeHint(30)
      .setPrefetchDistance(5)
      .setEnablePlaceholders(true)
      .build();


      I have enabled placeholders & that lands me to managing null in
      PagedListAdapter class. I have done that something like below,



      @Override
      public void onBindViewHolder(@NonNull MyEventViewHolder holder, int position) {
      Article mArticle = getItem(position);

      if (mArticle != null) {
      holder.txtTitle.setText(mArticle.getTitle());
      holder.txtAuthor.setText(mArticle.getAuthor());
      holder.txtDesc.setText(mArticle.getDescription());
      } else {
      holder.txtTitle.setText("...");
      holder.txtAuthor.setText("......");
      holder.txtDesc.setText(".........");
      }
      }


      I am unable to see placeholders at the end of a list before next API call.



      My question is, Is there a way that I can specify the size of list after first API call? As my API is returning total number of items to be expected from the query. If not possible that what else I can do to see placeholders for my list.



      Note : I cannot switch to ItemKeyedDataSource or PositionalDataSource because my API is set to respond on page basis.







      android android-layout android-recyclerview android-jetpack android-paging






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Jan 2 at 10:06









      buzzingsilentlybuzzingsilently

      865516




      865516
























          1 Answer
          1






          active

          oldest

          votes


















          2














          For this I think you need to do loadInitial inside



          callback.onResult(mArticles, 0, SIZE_OF_TOTAL_ITEMS, null, 2L);


          loadBefore



          callback.onResult(mArticles, params.key - 1);


          loadAfter



          callback.onResult(mArticles, params.key + 1);


          And there is SIZE_OF_TOTAL_ITEMS must be known at initial load time.






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54004388%2fset-datasource-size-in-pagekeyeddatasource-to-get-placeholder-effect%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            2














            For this I think you need to do loadInitial inside



            callback.onResult(mArticles, 0, SIZE_OF_TOTAL_ITEMS, null, 2L);


            loadBefore



            callback.onResult(mArticles, params.key - 1);


            loadAfter



            callback.onResult(mArticles, params.key + 1);


            And there is SIZE_OF_TOTAL_ITEMS must be known at initial load time.






            share|improve this answer




























              2














              For this I think you need to do loadInitial inside



              callback.onResult(mArticles, 0, SIZE_OF_TOTAL_ITEMS, null, 2L);


              loadBefore



              callback.onResult(mArticles, params.key - 1);


              loadAfter



              callback.onResult(mArticles, params.key + 1);


              And there is SIZE_OF_TOTAL_ITEMS must be known at initial load time.






              share|improve this answer


























                2












                2








                2







                For this I think you need to do loadInitial inside



                callback.onResult(mArticles, 0, SIZE_OF_TOTAL_ITEMS, null, 2L);


                loadBefore



                callback.onResult(mArticles, params.key - 1);


                loadAfter



                callback.onResult(mArticles, params.key + 1);


                And there is SIZE_OF_TOTAL_ITEMS must be known at initial load time.






                share|improve this answer













                For this I think you need to do loadInitial inside



                callback.onResult(mArticles, 0, SIZE_OF_TOTAL_ITEMS, null, 2L);


                loadBefore



                callback.onResult(mArticles, params.key - 1);


                loadAfter



                callback.onResult(mArticles, params.key + 1);


                And there is SIZE_OF_TOTAL_ITEMS must be known at initial load time.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Jan 2 at 12:42









                Sameer JaniSameer Jani

                696210




                696210
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54004388%2fset-datasource-size-in-pagekeyeddatasource-to-get-placeholder-effect%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    MongoDB - Not Authorized To Execute Command

                    How to fix TextFormField cause rebuild widget in Flutter

                    Npm cannot find a required file even through it is in the searched directory