[] Easy async loading for Android's ListView/GridView

Related tags

Utility smoothie
Overview

NOTE: Smoothie's API is not final yet. Although the library is fairly funcional, this is still beta-quality code. Do not rely on it for production code just yet. Feedback is very welcome!

What is it?

Smoothie provides a simple API to load ListView/GridView items asynchronously, off the UI thread.

Features

  • Tiny API to implement asynchonous loading of items in Android's ListView and GridView.
  • Multi-part item support: split the loading of each item into separate asynchronous operations with different global priorities.
  • Tight integration between user interaction and async loading of items i.e. stops loading items on fling, enables loading when panning with finger down, etc.
  • Prefetch items beyond the currently visible items to reduce the number of placeholder-type items while scrolling.

How do I use it?

  1. Add Smoothie's jar as a dependency to your project.

  2. Add an AsyncListView or AsyncGridView to your layout.

  3. Implement an SimpleItemLoader. You're only required to override three methods: getItemParams(), loadItem(), and displayItem(). You can override more methods if you want to handle loading items from memory, preloading items, resetting item views, etc.

  4. On Activity/Fragment creation, attach an ItemManager instance to your AsyncListView/AsyncGridView:

    ItemManager.Builder builder = new ItemManager.Builder(yourItemLoader);
    builder.setPreloadItemsEnabled(true).setPreloadItemsCount(5);
    builder.setThreadPoolSize(4);
    ItemManager itemManager = builder.build();
    
    AsyncListView listView = (AsyncListView) findViewById(R.id.list);
    listView.setItemManager(itemManager);

The sample app has an example of an ItemEngine powered by Android-BitmapCache that fades images in as they finish loading on a ListView.

The API docs contain a more detailed overview of the API.

Download

Grab via Maven:

<dependency>
  <groupId>org.lucasr.smoothie</groupId>
  <artifactId>smoothie</artifactId>
  <version>0.1.0</version>
</dependency>

or Gradle:

compile 'org.lucasr.smoothie:smoothie:0.1.0'

Want to help?

File new issues to discuss specific aspects of the API and to propose new features.

License

Copyright 2012 Lucas Rocha

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • multiple images per list item

    multiple images per list item

    any thoughts as to how to go about loading multiple images in a single row? looking through the code, i can't tell if it would be a rather complicated mess to handle or if it is pretty much baked in. sorry if this is an inappropriate forum for this question, but i figured it would be a good publicly answered question for others who are curious.

    opened by mrtristan 8
  • Runs out of Memory after switching from portrait to landscape orientation

    Runs out of Memory after switching from portrait to landscape orientation

    I have found that using the library, my Samsung Tab3 device runs out of memory when scrolling and switching to/from portrait/landscape. Initially the gridview is populated (with albumart) normally. Flinging up and down uses around 65 to 70Mb. and this level is fairly constant. However, once you have switched orientation, memory usage jumps up and quickly reaches over 90Mb after which the scrolling and refreshing becomes extremely slow. Finallly the app simply stops. (no ANR) I have taken the sample Gallery app, but instead of images, I display albumart. No other amendments were made. I have around 600 albums to display. ps tested with an earlier version but same behaviour

    opened by theoklink 5
  • Runtime Exception when inflating AsyncListView

    Runtime Exception when inflating AsyncListView

    When i try to inflate the AsyncListView, like this:

    AsyncListView mListView = (AsyncListView) findViewById(android.R.id.list);

    This is the xml:

              xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@android:id/list"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />```
    
    
    It gives me this error: 
    

    01-30 23:57:50.765: E/AndroidRuntime(11847): FATAL EXCEPTION: main 01-30 23:57:50.765: E/AndroidRuntime(11847): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.giscar/br.com.giscar.ui.ACTDeviceSelectAsync}: android.view.InflateException: Binary XML file line #20: Error inflating class org.lucasr.smoothie.AsyncListView 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.os.Handler.dispatchMessage(Handler.java:99) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.os.Looper.loop(Looper.java:123) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.app.ActivityThread.main(ActivityThread.java:3687) 01-30 23:57:50.765: E/AndroidRuntime(11847): at java.lang.reflect.Method.invokeNative(Native Method) 01-30 23:57:50.765: E/AndroidRuntime(11847): at java.lang.reflect.Method.invoke(Method.java:507) 01-30 23:57:50.765: E/AndroidRuntime(11847): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 01-30 23:57:50.765: E/AndroidRuntime(11847): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 01-30 23:57:50.765: E/AndroidRuntime(11847): at dalvik.system.NativeStart.main(Native Method) 01-30 23:57:50.765: E/AndroidRuntime(11847): Caused by: android.view.InflateException: Binary XML file line #20: Error inflating class org.lucasr.smoothie.AsyncListView 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.view.LayoutInflater.createView(LayoutInflater.java:518) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:570) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.view.LayoutInflater.rInflate(LayoutInflater.java:623) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.view.LayoutInflater.inflate(LayoutInflater.java:408) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 01-30 23:57:50.765: E/AndroidRuntime(11847): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:209) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.app.Activity.setContentView(Activity.java:1657) 01-30 23:57:50.765: E/AndroidRuntime(11847): at br.com.giscar.ui.ACTDeviceSelectAsync.onCreate(ACTDeviceSelectAsync.java:41) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 01-30 23:57:50.765: E/AndroidRuntime(11847): ... 11 more 01-30 23:57:50.765: E/AndroidRuntime(11847): Caused by: java.lang.reflect.InvocationTargetException 01-30 23:57:50.765: E/AndroidRuntime(11847): at java.lang.reflect.Constructor.constructNative(Native Method) 01-30 23:57:50.765: E/AndroidRuntime(11847): at java.lang.reflect.Constructor.newInstance(Constructor.java:415) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.view.LayoutInflater.createView(LayoutInflater.java:505) 01-30 23:57:50.765: E/AndroidRuntime(11847): ... 21 more 01-30 23:57:50.765: E/AndroidRuntime(11847): Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x1/d=0x7f06009b a=1 r=0x7f06009b} 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.content.res.Resources.loadDrawable(Resources.java:1681) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.widget.AbsListView.(AbsListView.java:658) 01-30 23:57:50.765: E/AndroidRuntime(11847): at android.widget.ListView.(ListView.java:201) 01-30 23:57:50.765: E/AndroidRuntime(11847): at org.lucasr.smoothie.AsyncListView.(AsyncListView.java:63) 01-30 23:57:50.765: E/AndroidRuntime(11847): at org.lucasr.smoothie.AsyncListView.(AsyncListView.java:58)

    
    
    
    opened by pirbe7 4
  • Updated to Gradle 1.9, android build tools 19 and Android Gradle plugin 0.7

    Updated to Gradle 1.9, android build tools 19 and Android Gradle plugin 0.7

    Updated project.

    This allows the project to be used with the latest version of Android Studio 0.4.+ (note I believe this stops compatibility with ASide 0.3.+)

    Added the build in Gradle wrapper so this project can be easily imported into ASide.

    opened by blundell 4
  • Help required

    Help required

    I am using the library in my app "Playlist Manager" The implementation of displaying albumart is more or less similar to the example. However, smoothie never seems to get it 100% correct. It seems to decide not to display according to some arbitary rules. I do not have the technical understanding to fully understand managing threads etc so have done my best to understand the process. I do not seem to get closer to resolving this.

    For example, without touching, displaying 5 tracks from the same album (id = 12) albumart icon on the left, track detail, track duration and checkbox, produces different results each time. Never are all tracks displayed with its albumart. When flinging and moving up/down, smoothie is never able to be 100% correct and often displays the incorrect albumart (related to the previous page) Below the sequence of events from ItemLoader using Log.i:

    performLoadItem for position 0 - shouldDisplayItem = true No pending item request, creating new: 12 performLoadItem - shouldDisplayItem = true|| isItemInMemory(itemParams) performLoadItem for position 1 - shouldDisplayItem = true No pending item request, creating new: 12 performLoadItem - shouldDisplayItem = true|| isItemInMemory(itemParams) performLoadItem for position 2 - shouldDisplayItem = true There's a pending item request, reusing: 12 performLoadItem - shouldDisplayItem = true|| isItemInMemory(itemParams) performLoadItem for position 3 - shouldDisplayItem = true There's a pending item request, reusing: 12 performLoadItem - shouldDisplayItem = true|| isItemInMemory(itemParams) performLoadItem for position 4 - shouldDisplayItem = true There's a pending item request, reusing: 12 performLoadItem - shouldDisplayItem = true|| isItemInMemory(itemParams) mRequest.itemView != null - Done loading image: mRequest.itemView != null - Done loading image: mRequest.itemView != null - Done loading image: mItemLoader.mHandler.post - run the display routine mItemLoader.mHandler.post - run the display routine mItemLoader.itemViewReused mRequest.itemView != null - Done loading image: mItemLoader.itemViewReused mRequest.itemView != null - Done loading image: mItemLoader.mHandler.post - run the display routine

    The end result is shown image

    The outcome is different each time.

    also During my investigation I found the following code line 705 if (mItemLoader.itemViewReused(mRequest)) { return; } but further on Line 719 the same test is made. Is one of these redundant?

    Who can help me out here?

    opened by theoklink 3
  • addFooterView cause IllegalStateException

    addFooterView cause IllegalStateException

    When i use AsyncListView with addFooterView for a endless listview always got

    IllegalStateException: The content of the adapter has changed but ListView did not receive a notification.

    I found a hacky way to solve this.

    change AsyncListView as fellow:

    @Override public ListAdapter getAdapter() { // if (mItemManaged != null) { // return mItemManaged.getWrappedAdapter(); // } else { // return super.getAdapter(); // } return super.getAdapter(); }

    please fix this.

    opened by galilio 3
  • Random elements re-appearing when flinging

    Random elements re-appearing when flinging

    Hello lucasr,

    I like your project very much, and I'd love to see it hit production! I don't know if the following is a bug or I'm doing something wrong, please advise.

    I use list items with some text and an imageview, data coming from db. If I scroll slowly, everything seems to work fine. However, when I fling the list, and there's no chance of preloading items fast enough, instead of seeing the default (empty) placeholder view, I see random, already left behind elements re-appearing until the loading finishes and correct data and images replace them.

    Could you please help me track down the source of this problem? It looks really annoying. Is there any place where the placeholder view gets cached? Where exactly does it get displayed until loading finishes?

    Thanks & regards, zsoltk

    opened by zsoltk 2
  • Use Smoothie with StaggeredGridView

    Use Smoothie with StaggeredGridView

    Hi,

    I'm experimenting with a StaggerdGridView and would it be possible to make Smoothie compatible with that? I's not a subclass of AbsListView.

    https://github.com/maurycyw/StaggeredGridView

    Thanks!

    opened by quintos 2
  • Feature suggestion: integration with pull to refresh listview

    Feature suggestion: integration with pull to refresh listview

    Hi, I guess it would be great if smoothie could be integrated with a pull to refresh listview library. Here's one that I found stable - https://github.com/chrisbanes/Android-PullToRefresh

    opened by khobaib 1
  • use not only on listviews

    use not only on listviews

    Why can't we use it to display the image on any imageview? Do we have to use AsyncListView? What will happen if we already using extended version of a listview? And how can we use it in a detail page for example?

    opened by tasomaniac 1
  • Cannot draw recycled bitmaps

    Cannot draw recycled bitmaps

    Hello,

    I'm using your lib with bitmap-cache on a ListView. On some devices (and randomly), I get this kind of error. My code is just a copy/paste of the example code, so I think the bug is on your side :)

    E/AndroidRuntime( 1669): FATAL EXCEPTION: main E/AndroidRuntime( 1669): java.lang.IllegalArgumentException: Cannot draw recycled bitmaps E/AndroidRuntime( 1669): at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:778) E/AndroidRuntime( 1669): at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:117) E/AndroidRuntime( 1669): at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:393) E/AndroidRuntime( 1669): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:216) E/AndroidRuntime( 1669): at android.widget.ImageView.onDraw(ImageView.java:961) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13458) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12409) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12453) E/AndroidRuntime( 1669): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2911) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12345) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12453) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13182) E/AndroidRuntime( 1669): at android.view.ViewGroup.drawChild(ViewGroup.java:2929) E/AndroidRuntime( 1669): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13461) E/AndroidRuntime( 1669): at android.widget.FrameLayout.draw(FrameLayout.java:467) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12409) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12453) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13182) E/AndroidRuntime( 1669): at android.view.ViewGroup.drawChild(ViewGroup.java:2929) E/AndroidRuntime( 1669): at android.widget.ListView.drawChild(ListView.java:3226) E/AndroidRuntime( 1669): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) E/AndroidRuntime( 1669): at android.widget.AbsListView.dispatchDraw(AbsListView.java:2433) E/AndroidRuntime( 1669): at android.widget.ListView.dispatchDraw(ListView.java:3221) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13461) E/AndroidRuntime( 1669): at android.widget.AbsListView.draw(AbsListView.java:3759) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12409) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12453) E/AndroidRuntime( 1669): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2911) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12345) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12453) E/AndroidRuntime( 1669): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2911) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12345) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12453) E/AndroidRuntime( 1669): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2911) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12345) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12453) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13182) E/AndroidRuntime( 1669): at android.view.ViewGroup.drawChild(ViewGroup.java:2929) E/AndroidRuntime( 1669): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13461) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12409) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12453) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13182) E/AndroidRuntime( 1669): at android.view.ViewGroup.drawChild(ViewGroup.java:2929) E/AndroidRuntime( 1669): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12407) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12453) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13182) E/AndroidRuntime( 1669): at android.view.ViewGroup.drawChild(ViewGroup.java:2929) E/AndroidRuntime( 1669): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13461) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12409) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12453) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13182) E/AndroidRuntime( 1669): at android.view.ViewGroup.drawChild(ViewGroup.java:2929) E/AndroidRuntime( 1669): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13461) E/AndroidRuntime( 1669): at android.widget.FrameLayout.draw(FrameLayout.java:467) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12409) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12453) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13182) E/AndroidRuntime( 1669): at android.view.ViewGroup.drawChild(ViewGroup.java:2929) E/AndroidRuntime( 1669): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12407) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12453) E/AndroidRuntime( 1669): at android.view.View.draw(View.java:13182) E/AndroidRuntime( 1669): at android.view.ViewGroup.drawChild(ViewGroup.java:2929) E/AndroidRuntime( 1669): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12407) E/AndroidRuntime( 1669): at android.view.View.getDisplayList(View.java:12

    opened by g123k 1
  • setItemManager prevents preview letter when implementing sectionIndexer

    setItemManager prevents preview letter when implementing sectionIndexer

    I have a ViewPager with 3 tabs, Tracks, Albums, Artists. Each fragment (alltracks, allalbums, allartists) is more or less identical apart from getting and displaying different media detail. For the fragments where I display albumart, the preview letter when fastscrolling does not show. However for the allartist tab, I do not display any albumart and have omitted mListView.setItemManager(builder.build()); The preview letter shows. Adding the ListView.setItemManager(builder.build()); code, preview letter dissappears.

    The SectionIndexer callbacks are not being called: public Object[] getSections(); public int getPositionForSection(int sectionIndex) public int getSectionForPosition(int position)

    Is there anyhing that can be done?

    opened by theoklink 0
  • Is this library still supported?

    Is this library still supported?

    I was just looking through this library and its just awesome, cheers for creating it. I guess its good to use in my recent application but just then i saw your note that it is still in beta? Would development continue on this library?

    opened by dhaval22 1
  • Loading additional data after first load

    Loading additional data after first load

    Sorry if this isn't the right place to ask, but in your BitmapCache example, you only load data the json for the patterns once, in my use case, I need to load additional pages after the first load (Each page has 20 results for example), would this be possible if so any hint how?

    opened by SalmanTKhan 0
  • Removing android.widget.Adapter dependency from ItemLoader

    Removing android.widget.Adapter dependency from ItemLoader

    Using generics in the ItemLoader is possible to avoid the dependency from android.widget.Adapter and ease future generalisations that can use other type of adapters/target views (eg: RecyclerView). This has been possible because ItemLoader does not rely on any android.widget.Adapter behaviour, but uses that type only in the signature of some of its business methods.

    opened by mr-archano 2
  • Multi-part items not loading

    Multi-part items not loading

    We have a 2-part item in our ListView, a big image with a small profile picture.

    Some big images (first priority) don't load when the user is looking at them. Edit: What I mean here, if you scroll slowly, the off-screen images load properly, but if an image is not loaded, and the user has that ListView item visible on the screen, it never loads.

    I enabled logging in Smoothie, and this is what I get on those items:

    "Item should not load, bailing: ..." (line 243 in ItemLoader)

    But they are null/set to placeholder, and should load. If I switch to single-item, the big images load properly.

    The current hack is commenting out the entire block starting with: if (!itemState.shouldLoadItem) {...}

    Everything works as it should then, but I'm guessing there's a good reason that block is there, and it's definitely not the proper way :).

    opened by blaztriglav 0
Owner
Lucas Rocha
Mobile UI platform at Facebook. Formerly at Mozilla, GNOME, litl, and Nokia.
Lucas Rocha
A convenient library to show a shimmer effect while loading data

A convenient library to show a shimmer effect while loading data. Easily convert your current view with a slick skeleton loading animation just by wrapping your view.

Justin Guedes 11 Apr 28, 2022
:iphone: [Android Library] Get device information in a super easy way.

EasyDeviceInfo Android library to get device information in a super easy way. The library is built for simplicity and approachability. It not only eli

Nishant Srivastava 1.7k Dec 22, 2022
Very easy to use wrapper library for Android SharePreferences

Treasure English document Treasure是一个Android平台上基于SharePreferences的偏好存储库,只需要定义接口,无需编写实现,默认支持Serializable和Parcelable。运行时0反射,不仅使用方便而且性能和原生写法几乎无差别。 使用方法 1

星一 507 Nov 12, 2022
Access and process various types of personal data in Android with a set of easy, uniform, and privacy-friendly APIs.

PrivacyStreams PrivacyStreams is an Android library for easy and privacy-friendly personal data access and processing. It offers a functional programm

null 269 Dec 1, 2022
Easy SharedPreference Engine foR ANDROid

esperandro Easy SharedPreference Engine foR ANDROid What? esperandro makes it simple to use SharedPreferences in a nicer and less error-prone way. Wit

David Kunzler 184 Nov 25, 2022
It's finally easy to take photos/videos via camera or get photos/videos from gallery on Android.

Shutter-Android It's finally easy to take photos/videos via camera or get photos/videos from gallery on Android. What is Shutter? Shutter is an Androi

Levi Bostian 56 Oct 3, 2022
A simple and easy to use stopwatch and timer library for android

TimeIt Now with Timer support! A simple and easy to use stopwatch and timer library for android Introduction A stopwatch can be a very important widge

Yashovardhan Dhanania 35 Dec 10, 2022
Android library which makes it easy to handle the different obstacles while calling an API (Web Service) in Android App.

API Calling Flow API Calling Flow is a Android library which can help you to simplify handling different conditions while calling an API (Web Service)

Rohit Surwase 19 Nov 9, 2021
An easy-to-use, cross-platform measurement tool that pulls data out of CD pipelines and analysis the four key metrics for you.

Maintained by SEA team, ThoughtWorks Inc. Read this in other languages: English, 简体中文 Table of Contents About the Project Usage How to Compute Contrib

Thoughtworks 277 Jan 7, 2023
Compose easy forms validation library

Compose EasyForms Focus on building your form UI while the library do the heavy work for you. Features Built in support for most of the Form widgets i

Kosh Sergani 24 Jul 18, 2022
Interactive prompts made easy!

Interactive prompts made easy!

David Simon 1 Nov 1, 2021
This is a easy way to publish MQTT message and receive MQTT message

SMQ-CLIENT This is a easy way to publish MQTT message and receive MQTT message This is provider a spring stater for quick use Recive message form the

SUDA 1 Apr 25, 2022
This library provides Easy Android ListView Adapters(EasyListAdapter & EasyCursorAdapter) which makes designing Multi-Row-Type ListView very simple & cleaner, It also provides many useful features for ListView.

EasyListViewAdapters Whenever you want to display custom items in listview, then only way to achieve this is to implement your own subclass of BaseAda

Biraj Patel 132 Nov 25, 2022
Just a Wheel——A easy way to setEmptyView to ListView、GridView or RecyclerView etc..

中文说明在这里 TEmptyView Just a Wheel—— A easier way to setEmptyView. Without having to write xml file every time. It supports AdapterView(ListView,GridView

Barry 454 Jan 9, 2023
Android ListView that mimics a GridView with asymmetric items. Supports items with row span and column span

AsymmetricGridView An Android custom ListView that implements multiple columns and variable sized elements. Please note that this is currently in a pr

Felipe Lima 1.8k Jan 7, 2023
Android widget with pull to refresh for all the views,and support loadMore for ListView , RecyclerView, GridView and SwipeRefreshLayout.

CommonPullToRefresh Android widget with pull to refresh for all the views,and support loadMore for ListView,RecyclerView,GridView and SwipeRefreshLayo

null 1.1k Nov 10, 2022
An Android Library that allows users to pull down a menu and select different actions. It can be implemented inside ScrollView, GridView, ListView.

AndroidPullMenu AndroidPullMenu is an Open Source Android library that allows developers to easily create applications with pull menu. The aim of this

Armando TBA 181 Nov 29, 2022
A custom SwipeRefreshLayout to support the pull-to-refresh featrue.RecyclerView,ListView,GridView,NestedScrollView,ScrollView are supported.

SuperSwipeRefreshLayout A custom SwipeRefreshLayout to support the pull-to-refresh featrue.You can custom your header view and footer view. RecyclerVi

Zheng Haibo(莫川) 1.3k Dec 13, 2022
A simple app to showcase Androids Material Design and some of the cool new cool stuff in Android Lollipop. RecyclerView, CardView, ActionBarDrawerToggle, DrawerLayout, Animations, Android Compat Design, Toolbar

#Android-LollipopShowcase This is a simple showcase to show off Android's all new Material Design and some other cool new stuff which is (new) in Andr

Mike Penz 1.8k Nov 10, 2022
Androids EditText that animates the typed text. EditText is extended to create AnimatedEditText and a PinEntryEditText.

AnimatedEditText for Android This repository contains AnimatedEditText and TextDrawable all of which extend the behaviour of EditText and implement fe

Ali Muzaffar 439 Nov 29, 2022