{"id":18784473,"url":"https://github.com/pwittchen/infinitescroll","last_synced_at":"2025-10-06T12:48:52.527Z","repository":{"id":57722221,"uuid":"51960935","full_name":"pwittchen/InfiniteScroll","owner":"pwittchen","description":"Infinite Scroll (Endless Scrolling) for RecyclerView in Android","archived":false,"fork":false,"pushed_at":"2020-08-19T08:51:23.000Z","size":1832,"stargazers_count":189,"open_issues_count":8,"forks_count":25,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-10-06T12:48:51.292Z","etag":null,"topics":["android","endless","endless-scroll","infinite","infinite-scroll","recyclerview","scroll","scrolling"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pwittchen.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":["pwittchen"],"custom":["https://paypal.me/pwittchen"]}},"created_at":"2016-02-17T22:43:44.000Z","updated_at":"2025-08-11T14:35:50.000Z","dependencies_parsed_at":"2022-08-29T23:00:44.430Z","dependency_job_id":null,"html_url":"https://github.com/pwittchen/InfiniteScroll","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/pwittchen/InfiniteScroll","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pwittchen%2FInfiniteScroll","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pwittchen%2FInfiniteScroll/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pwittchen%2FInfiniteScroll/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pwittchen%2FInfiniteScroll/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pwittchen","download_url":"https://codeload.github.com/pwittchen/InfiniteScroll/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pwittchen%2FInfiniteScroll/sbom","scorecard":{"id":750806,"data":{"date":"2025-08-11","repo":{"name":"github.com/pwittchen/InfiniteScroll","commit":"efec6e4a1483424d04d291e465862c0adfa415db"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":0,"reason":"Found 0/4 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 26 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T20:18:19.516Z","repository_id":57722221,"created_at":"2025-08-22T20:18:19.516Z","updated_at":"2025-08-22T20:18:19.516Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278614461,"owners_count":26015967,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","endless","endless-scroll","infinite","infinite-scroll","recyclerview","scroll","scrolling"],"created_at":"2024-11-07T20:43:08.011Z","updated_at":"2025-10-06T12:48:52.459Z","avatar_url":"https://github.com/pwittchen.png","language":"Java","funding_links":["https://github.com/sponsors/pwittchen","https://paypal.me/pwittchen"],"categories":[],"sub_categories":[],"readme":"# InfiniteScroll  [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-InfiniteScroll-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/3237) [![Build Status](https://travis-ci.org/pwittchen/InfiniteScroll.svg?branch=master)](https://travis-ci.org/pwittchen/InfiniteScroll) ![Maven Central](https://img.shields.io/maven-central/v/com.github.pwittchen/infinitescroll.svg?style=flat)\nInfinite Scroll (Endless Scrolling) for RecyclerView in Android\n\nJavaDoc is available at: http://pwittchen.github.io/InfiniteScroll/\n\nContents\n--------\n- [Motivation](#motivation)\n- [Examples](#examples)\n- [Usage](#usage)\n- [Download](#download)\n- [Tests](#tests)\n- [Code style](#code-style)\n- [Static Code Analysis](#static-code-analysis)\n- [Who is using this library?](#who-is-using-this-library)\n- [License](#license)\n\nMotivation\n----------\n\nFor a long time I couldn't find the right implementation of the infinite scroll AKA endless scroll for Android. A few solutions I've found weren't production ready, weren't working correctly or had too many features. I wanted to have small, easy and flexible solution to implement infinite scroll for Android, which works with `RecyclerView` from the newest Android API. That's why this project was created.\n\nExamples\n--------\n\nSample app can be found in `app` directory.\n\nBelow, you can see an animation presenting, how sample application works.\n\nMoreover, you can see examplary usage of this library in [SearchTwitter](https://github.com/pwittchen/SearchTwitter) app.\n\n![Demo](https://raw.githubusercontent.com/pwittchen/InfiniteScroll/master/demo.gif)\n\nUsage\n-----\n\nCreate necessary fields in your `Activity`:\n\n```java\npublic RecyclerView recyclerView;\nprivate LinearLayoutManager layoutManager;\n```\n\nCreate new `InfiniteScrollListener`:\n\n```java\nprivate InfiniteScrollListener createInfiniteScrollListener() {\n  return new InfiniteScrollListener(maxItemsPerRequest, layoutManager) {\n    @Override public void onScrolledToEnd(final int firstVisibleItemPosition) {\n      // load your items here\n      // logic of loading items will be different depending on your specific use case\n      \n      // when new items are loaded, combine old and new items, pass them to your adapter\n      // and call refreshView(...) method from InfiniteScrollListener class to refresh RecyclerView\n      refreshView(recyclerView, new MyAdapter(items), firstVisibleItemPosition);\n    }\n  }\n}\n```\n\nInitialize `RecyclerView` and `LinearLayoutManager` in your `Activity`:\n\n```java\n@Override protected void onCreate(Bundle savedInstanceState) {\n  recyclerView = (RecyclerView) findViewById(R.id.recycler_view);\n\n  layoutManager = new LinearLayoutManager(this);\n  recyclerView.setHasFixedSize(true);\n  recyclerView.setLayoutManager(layoutManager);\n  \n  // set your custom adapter\n  recyclerView.setAdapter(new MyAdapter(items));\n  \n  // add InfiniteScrollListener as OnScrollListener\n  recyclerView.addOnScrollListener(createInfiniteScrollListener());\n}\n```\n\nIf you want to display loading progress, you should add additional view for it, show it while loading starts and hide it when loading is finished. Check exemplary app in this repository to see concrete solution.\n\nThat's it!\n\nDownload\n--------\n\nLatest version: ![Maven Central](https://img.shields.io/maven-central/v/com.github.pwittchen/infinitescroll.svg?style=flat)\n\nreplace `x.y.z` with the latest version\n\nYou can depend on the library through Maven:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.pwittchen\u003c/groupId\u003e\n    \u003cartifactId\u003einfinitescroll\u003c/artifactId\u003e\n    \u003cversion\u003ex.y.z\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nor through Gradle:\n\n```groovy\ndependencies {\n  compile 'com.github.pwittchen:infinitescroll:x.y.z'\n}\n```\n\nTests\n-----\n\nTo execute unit tests run:\n\n```\n./gradlew test\n```\n\nCode style\n----------\n\nCode style used in the project is called `SquareAndroid` from Java Code Styles repository by Square available at: https://github.com/square/java-code-styles.\n\nStatic Code Analysis\n--------------------\n\nTo run Static Code Analysis, type:\n\n```\n./gradlew check\n```\n\nReports from analysis are generated in `library/build/reports/` directory.\n\nWho is using this library?\n-------------------------\n\n- [Noute](https://play.google.com/store/apps/details?id=com.github.pierry.noute)\n- and more...\n\nAre you using this library in your app and want to be listed here? Send me a Pull Request or an e-mail to piotr@wittchen.io\n\nLicense\n-------\n\n    Copyright 2016 Piotr Wittchen\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n    \n       http://www.apache.org/licenses/LICENSE-2.0\n    \n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpwittchen%2Finfinitescroll","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpwittchen%2Finfinitescroll","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpwittchen%2Finfinitescroll/lists"}