An Adapter that allows a RecyclerView to be split into Sections with headers and/or footers. Each Section can have its state controlled individually.

Overview

⚠️ Archived: this repository is no longer going to be maintained.

SectionedRecyclerViewAdapter

An Adapter that allows a RecyclerView to be split into Sections with headers and/or footers.

Version Total Downloads Build Status codecov Android Arsenal

Linear Grid

In addition, each Section can have its state(Loading/Loaded/Failed/Empty) controlled individually.

Loading Loaded


Gradle Dependency

Step 1: Add jitpack repository to the top-level build.gradle file:
allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}
Step 2: Add this library to the module-level build.gradle file:
dependencies {
	...
	implementation 'com.github.luizgrp:SectionedRecyclerViewAdapter:v3.2.0'
}

Guide to upgrade to version 3.x here.

Latest version without AndroidX: 1.2.0.

Basic usage

1) Create a custom Section class:
class MySection extends Section {
    List<String> itemList = Arrays.asList("Item1", "Item2", "Item3");

    public MySection() {
        // call constructor with layout resources for this Section header and items
        super(SectionParameters.builder()
                .itemResourceId(R.layout.section_item)
                .headerResourceId(R.layout.section_header)
                .build());
    }

    @Override
    public int getContentItemsTotal() {
        return itemList.size(); // number of items of this section
    }

    @Override
    public RecyclerView.ViewHolder getItemViewHolder(View view) {
        // return a custom instance of ViewHolder for the items of this section
        return new MyItemViewHolder(view);
    }

    @Override
    public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) {
        MyItemViewHolder itemHolder = (MyItemViewHolder) holder;

        // bind your view here
        itemHolder.tvItem.setText(itemList.get(position));
    }
    
    @Override
    public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
        // return an empty instance of ViewHolder for the headers of this section
        return new EmptyViewHolder(view);
    }
}
2) Create a custom ViewHolder for the section items:
class MyItemViewHolder extends RecyclerView.ViewHolder {
    private final TextView tvItem;

    public MyItemViewHolder(View itemView) {
        super(itemView);

        tvItem = (TextView) itemView.findViewById(R.id.tvItem);
    }
}
3) Set up your RecyclerView with the SectionedRecyclerViewAdapter:
// Create an instance of SectionedRecyclerViewAdapter
SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter();

// Add your Sections
sectionAdapter.addSection(new MySection());

// Set up your RecyclerView with the SectionedRecyclerViewAdapter
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(sectionAdapter);

Demo app

You can find a demo app here with many examples on how to implement:

Demo

Apps on Google Play using this library

License

The MIT License (MIT)

Copyright (c) 2016 Gustavo Pagani

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Comments
  • Add support for multiple view holders in a given section

    Add support for multiple view holders in a given section

    Would it be possible to implement something like RecyclerView.Adapter's public int getItemViewType(int position) to allow one to define logic for loading different view holders in a given section?

    enhancement wontfix 
    opened by kevinwo 21
  • Fatal Exception: java.util.ConcurrentModificationException while adding sections

    Fatal Exception: java.util.ConcurrentModificationException while adding sections

    Hi,

    I use your library for my app's main screen. I get data from our server with asynctask(via okhttp) and i add sections in this tasks. I update adapter using either notifyDataSetChanged or notifyItemRangeInserted. But sometimes i get following exception. Can you suggest me anything to fix this problem? Thank you.

    Fatal Exception: java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(HashMap.java:787) at java.util.HashMap$EntryIterator.next(HashMap.java:824) at java.util.HashMap$EntryIterator.next(HashMap.java:824) at io.github.luizgrp.sectionedrecyclerviewadapter.SectionedRecyclerViewAdapter.onCreateViewHolder(SectionedRecyclerViewAdapter.java:43) at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6367) at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5555) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5440) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5436) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2224) at android.support.v7.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:556) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511) at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595) at android.support.v7.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170) at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3583) at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3312) at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3844) at android.view.View.layout(View.java:17050) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:636) at android.view.View.layout(View.java:17050) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1189) at android.view.View.layout(View.java:17050) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396) at android.widget.FrameLayout.onLayout(FrameLayout.java:333) at android.view.View.layout(View.java:17050) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1189) at android.view.View.layout(View.java:17050) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396) at android.widget.FrameLayout.onLayout(FrameLayout.java:333) at android.view.View.layout(View.java:17050) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844) at android.widget.LinearLayout.onLayout(LinearLayout.java:1753) at android.view.View.layout(View.java:17050) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396) at android.widget.FrameLayout.onLayout(FrameLayout.java:333) at android.view.View.layout(View.java:17050) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844) at android.widget.LinearLayout.onLayout(LinearLayout.java:1753) at android.view.View.layout(View.java:17050) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396) at android.widget.FrameLayout.onLayout(FrameLayout.java:333) at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2794) at android.view.View.layout(View.java:17050) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2568) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2268) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1335) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6804) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:894) at android.view.Choreographer.doCallbacks(Choreographer.java:696) at android.view.Choreographer.doFrame(Choreographer.java:631) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:880) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5902) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:948) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:809)

    wontfix 
    opened by erenbakac 20
  • Alternative to sectionAdapter.notifyDataSetChanged

    Alternative to sectionAdapter.notifyDataSetChanged

    Most of the time, whenever there are background threads performing

    • Change Section state from LOADING to EMPTY
    • Change Section state from LOADED to EMPTY
    • setHasHeader(true)/ setHasHeader(false)
    • section.setVisible(true)/ section.setVisible(false)

    I will use sectionAdapter.notifyDataSetChanged, so that visualize effect will take in immediately.

    However, when I implement a complex drag-n-drop/ drag-n-move UX in one of the Sections, I wish to avoid using sectionAdapter.notifyDataSetChanged. The reason is that, if other Section threads call sectionAdapter.notifyDataSetChanged, it will break my Watchlist section drag-n-drop/ drag-n-move UX effect.

    a

    After experimenting, I had came out with the following code to replace sectionAdapter.notifyDataSetChanged

    if (orders.isEmpty()) {
        orderSection.setState(Section.State.EMPTY);
    
        if (orderSection.hasHeader()) {
            int headerPosition = sectionAdapter.getHeaderPositionInAdapter(orderSection);
            orderSection.setHasHeader(false);
            sectionAdapter.notifyItemRemovedFromSection(orderSection, headerPosition);
        }
    
        // I think this works fine, if it changed from LOADING TO EMPTY. But,
        // what if it changed from LOADED (More than 1 item) to EMPTY? Does the
        // following code still work fine?
        sectionAdapter.notifyItemRangeChangedInSection(
                orderSection,
                0,
                1
        );
    } else {
        orderSection.updateOrders(orders);
        if (!orderSection.hasHeader()) {
            orderSection.setHasHeader(true);
            sectionAdapter.notifyHeaderChangedInSection(orderSection);
        }
        
        if (orderSection.getState() != Section.State.LOADED) {
            orderSection.setState(Section.State.LOADED);
        }
    
        sectionAdapter.notifyItemRangeChangedInSection(
                orderSection,
                0,
                orderSection.getContentItemsTotal()
        );
    }
    
    1. When I hide header, I use notifyItemRemovedFromSection
    2. When I show header, I use notifyHeaderChangedInSection
    3. When I change State from LOADING to EMPTY, I use notifyItemRangeChangedInSection, with item count is 1.
    4. When I change State from X to LOADED, I use notifyItemRangeChangedInSection, with item count is Section.getContentItemsTotal().

    Do you think the above is a good way, so that our update operation is capped at Section level, and doesn't spread to other Section?

    What other notification way I can use, if I have the following case?

    1. When section.setVisible(true)/ section.setVisible(false)
    2. When I change State from LOADED to EMPTY ?

    Thanks.

    enhancement question 
    opened by yccheok 18
  • Does it make sense to provide notifyItemChangedInHeader and notifyItemChangedInFooter

    Does it make sense to provide notifyItemChangedInHeader and notifyItemChangedInFooter

    I was wondering, does it make sense, to provide the following methods

    notifyItemChangedInHeader(String TAG)
    notifyItemChangedInHeader(Section section)
    notifyItemChangedInFooter(String TAG)
    notifyItemChangedInFooter(Section section)
    

    Currently, I have the following use case.

    small

    For the following 3 components, they are belongs to single item in single section

    • price (968.99) as same Item within same Section
    • chart as same Item within same Section
    • buttons (buy & sell) as same Item within same Section

    So, whenever there are changes in price or buttons, I need to call notifyItemChangedInItem. However, chart drawing is an expensive activity. Calling notifyItemChangedInItem will cause unnecessary chart re-drawing. My current workaround is to keep a special position flag, to prevent unnecessary chart re-drawing.

    My ideal way is to place

    • price (968.99) as Header within same Section
    • chart as Item within same Section
    • buttons (buy & sell) as Footer within same Section

    So, whenever there are changes in price or buttons, I just need to call notifyItemChangedInHeader or notifyItemChangedInFooter, without trigger chart as item.

    If such changes make sense, I'm more to happy to send another pull request for that.

    Thank you.

    enhancement 
    opened by yccheok 11
  • It is possible to write a guideline on how to use DiffUtil.Callback with SectionedRecyclerViewAdapter?

    It is possible to write a guideline on how to use DiffUtil.Callback with SectionedRecyclerViewAdapter?

    Hi,

    Now, many Android communities recommend to use DiffUtil when dealing with RecyclerView

    https://medium.com/@iammert/using-diffutil-in-android-recyclerview-bdca8e4fbb00

    Is it possible to write a guideline, on how to use DiffUtil with SectionedRecyclerViewAdapter? As, I still struggling to get DiffUtil to work with SectionedRecyclerViewAdapter.

    Thank you.

    question 
    opened by yccheok 9
  • Why is gradle complaining about not finding appcompat-v7.jar?

    Why is gradle complaining about not finding appcompat-v7.jar?

    so I'm adding the library as a depency like this:

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:24.1.1'
        compile 'com.android.support:design:24.1.1'
        ...
        compile 'io.github.luizgrp.sectionedrecyclerviewadapter:sectionedrecyclerviewadapter:1.0.4'
    }
    
    

    But when trying to sync the project with Gradle, I get this:

    Warning:Module 'com.android.support:appcompat-v7:24.1.1' depends on one or more Android Libraries but is a jar
    Error:A problem occurred configuring project ':app'.
    > Could not find appcompat-v7.jar (com.android.support:appcompat-v7:24.1.1).
      Searched in the following locations:
          https://jcenter.bintray.com/com/android/support/appcompat-v7/24.1.1/appcompat-v7-24.1.1.jar
    
    

    I know that the problem is caused by the library, because when I delete that line the project syncs successfully.

    This is the full app/build.gradle file:

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 24
        buildToolsVersion "24.0.1"
    
        defaultConfig {
            applicationId "com.boel.demorv"
            minSdkVersion 15
            targetSdkVersion 24
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:24.1.1'
        compile 'com.android.support:design:24.1.1'
        compile 'com.android.support:cardview-v7:24.1.1'
        compile 'com.google.code.gson:gson:2.7'
        compile 'com.google.android.gms:play-services-maps:9.4.0'
        compile 'io.github.luizgrp.sectionedrecyclerviewadapter:sectionedrecyclerviewadapter:1.0.4'
    }
    

    So, why is gradle complaining about not finding appcompat-v7.jar in https://jcenter.bintray.com/com/android/support/appcompat-v7/24.1.1/appcompat-v7-24.1.1.jar?

    Thanks in advance! I really want to use this library.

    invalid 
    opened by lucas-dev 7
  • Is it possible to support Paging concept introduced in recent year?

    Is it possible to support Paging concept introduced in recent year?

    • [x] I have verified there are no duplicate open or recent questions.
    • [x] I have read over the documentation, checked out the examples and the demo app.
    • [x] I have given my issue a non-generic title.
    • [x] I understand that if I ask the same question in stackoverflow website I will get answers way faster as more people will try to answer it.
    • [x] I understand that if I don't show a minimum effort of what I have tried and where I got stuck the question will be closed and marked as invalid.
    • [x] I have read the article How do I ask a good question?
    • [x] I understand that this library is a custom Adapter and NOT a custom RecyclerView. I understand the difference between them and what is possible to be done in an Adapter but not in a RecyclerView.

    I really like the addSection concept provided by this library.

    In recent year, Google introduced Paging concept. Instead of having to load entire data from database into memory, then present it in RecyclerView. User can now choose to only load a very small subset of data, during RecyclerView scrolling.

    Google achieves so by introducing

    • https://developer.android.com/reference/android/arch/paging/PagedListAdapter
    • LiveData<PageList<...>> returned by Room DB

    The key concept, is to call submitList in PagedListAdapter, whenever the new subset of data is available, during scrolling.

    A nice introduction video during Google I/O 2018 is available - https://www.youtube.com/watch?v=BE5bsyGGLf4

    Currently, I cannot see a direct way, how we can fit such submitList paging concept, into SectionedRecyclerViewAdapter.

    I was wondering, do you have any idea how we can achieve Section concept, yet able to provide paging capability?

    Thank you.

    enhancement help wanted wontfix 
    opened by yccheok 6
  • Error build after implementing library version 2.1.0

    Error build after implementing library version 2.1.0

    Dear Supporters,

    I want to use this library on my project, but after I implementation the library version 2.1.0 as below:

    implementation 'io.github.luizgrp.sectionedrecyclerviewadapter:sectionedrecyclerviewadapter:2.1.0'

    Then I ran my project and I got an error:

    :app:transformClassesWithMultidexlistForDebug FAILED

    FAILURE: Build failed with an exception.

    • What went wrong: Execution failed for task ':app:transformClassesWithMultidexlistForDebug'.

    com.android.build.api.transform.TransformException: Error while generating the main dex list.

    • Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

    • Get more help at https://help.gradle.org

    BUILD FAILED in 4s

    This is my build tool of my project: android { compileSdkVersion 28 buildToolsVersion '28.0.3' defaultConfig { multiDexEnabled true minSdkVersion 19 targetSdkVersion 26 } SectionedRecyclerViewAdapter library:

    • Version: 2.1.0

    Could you please help me to resolve this issue?

    Thanks in advance.

    invalid 
    opened by MathiewNguyen 6
  • Add onBind*ViewHolder methods with payloads parameter

    Add onBind*ViewHolder methods with payloads parameter

    • [x] I understand that if I don't use one of the following templates the issue will be closed and marked as invalid.

    PR TEMPLATE

    Use Case

    Add onBind*ViewHolder methods with payloads parameter to Section and StatelessSection classes so it can be handled appropriately when the notify methods with payload parameter are called.

    Design

    • In SectionedRecyclerViewAdapter:

    Override onBindViewHolder(RecyclerView.ViewHolder holder, int position, List payloads) to call onBind*ViewHolder with the payloads parameter, reusing the code from onBindViewHolder(RecyclerView.ViewHolder holder, int position). It should call super if payloads is empty. References: this message from Yigit in this article. Examples here and here.

    • In Section and StatelessSection:

      • For every onBind*ViewHolder method, add a correspondent one with the payloads parameter;
      • Make onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) non abstract.
    • Add unit tests.

    • Add sample in demo app.

    How to use

    Same usage as normal notify* and onBindViewHolder methods with payload as parameter from RecyclerView.Adapter.

    enhancement  opened by luizgrp 6
  • When using regular adapter normal RecyclerView works in a Fragment, but only the Section Header displays with SectionedRecyclerView.

    When using regular adapter normal RecyclerView works in a Fragment, but only the Section Header displays with SectionedRecyclerView.

    I have created a Section and a custom ItemViewHolder according to your ReadMe, but unable to get more than the header to display when switching from mAdapter to sectionedAdapter.

    invalid question 
    opened by apowell656 6
  • Is using Section as HashMap key a good design?

    Is using Section as HashMap key a good design?

    I have been using version 1.2.0 for several years.

    I tries to start a new project with version 3.1.0

    I notice there are some significant design change especially

    https://github.com/luizgrp/SectionedRecyclerViewAdapter/blob/master/library/src/main/java/io/github/luizgrp/sectionedrecyclerviewadapter/SectionedRecyclerViewAdapter.java#L36

    My question is, is using Section abstract class as HashMap key a good design? What if, the child of Section, override hashCode and equals method?

    Thanks.

    enhancement 
    opened by yccheok 5
  • Releases(v3.2.0)
    Owner
    Gustavo Pagani
    Gustavo Pagani
    Lightweight android library for highlighting sections of a textview, with optional callbacks.

    Linker Lightweight android library for highlighting Strings inside of a textview (ignoring case), with optional callbacks. Language: Java MinSDK: 17 J

    Josh Gainey 35 Apr 30, 2022
    Implementation of a TextView and all its direct/indirect subclasses with native support for the Roboto fonts, includes the brand new Roboto Slab fonts.

    Android-RobotoTextView Implementation of a TextView and all its direct/indirect subclasses with native support for the Roboto fonts, includes the bran

    Evgeny Shishkin 782 Nov 12, 2022
    A TextView that automatically resizes text to fit perfectly within its bounds.

    AutoFitTextView A TextView that automatically resizes text to fit perfectly within its bounds. Usage dependencies { compile 'me.grantland:autofitt

    Grantland Chew 4.2k Jan 1, 2023
    A TextView that changes its content automatically every few seconds

    FadingTextView A TextView that changes its content automatically every few seconds Demo app A demo app is available on Google Play: Usage Add this to

    Tomer Rosenfeld 1.7k Dec 9, 2022
    An AutoCompleteTextView with builtin Adapter with the emails in the device.

    EmailAutoCompleteTextView An AutoCompleteTextView with builtin Adapter with the emails in the device. The library automatically adds GET_ACCOUNTS perm

    Said Tahsin Dane 423 Nov 11, 2022
    Provides a set of views which allows to adjust the spacing between the characters of that view, AKA, Kerning effect.

    KerningViews KerningViews provides a set of views (currently only TextView and Button) which lets you adjust the spacing between the characters in the

    Aritra Roy 148 Aug 7, 2022
    A TextView library that allows the user to increase/decrease font size with a two finger gesture by the user.

    PinchZoomTextView Library This library allows you to have a TextView that will grow/shrink the font size using gestures from the user. Usage To have a

    null 311 Nov 23, 2022
    Android's TextView that can expand/collapse like the Google Play's app description

    ExpandableTextView ExpandableTextView is an Android library that allows developers to easily create an TextView which can expand/collapse just like th

    Manabu S. 4k Dec 28, 2022
    Custom view to expand long text with view more,less action , you can customize min lines , action color

    ExpandableTextView Custom expadable text view Examples : <mostafa.projects.expandabletextview.ExpandableTextView android:layout_wi

    Mostafa Gad 8 Jan 25, 2022
    AutoLinkTextView is TextView that supports Hashtags (#), Mentions (@) , URLs (http://), Phone and Email automatically detecting and ability to handle clicks.

    AutoLinkTextView Deprecated Please use the new version of AutoLinkTextView AutoLinkTextView is TextView that supports Hashtags (#), Mentions (@) , URL

    Arman 1.1k Nov 23, 2022
    Chips EditText, Token EditText, Bubble EditText, Spannable EditText and etc.. There are many names of this control. Here I develop easy to understand , modify and integrate Chips Edit Text widget for Android

    Chips EditText Library Chips EditText, Token EditText, Bubble EditText, Spannable EditText and etc.. There are many names of this control. Here I deve

    kpbird 381 Nov 20, 2022
    Form validation and feedback library for Android. Provides .setText for more than just TextView and EditText widgets. Provides easy means to validate with dependencies.

    android-formidable-validation Form validation and feedback library for Android. Provides .setText for more than just TextView and EditText widgets. Pr

    Linden 147 Nov 20, 2022
    MarkdownView is an Android webview with the capablity of loading Markdown text or file and display it as HTML, it uses MarkdownJ and extends Android webview.

    MarkdownView is an Android webview with the capablity of loading Markdown text or file and display it as HTML, it uses MarkdownJ and extends Android webview.

    Feras Alnatsheh 1k Dec 20, 2022
    Include MatchTextView and MatchButton..Come..you will like it

    Android MatchView This project is learned from (https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh) . Thanks for liaohuqiu.. I like the animat

    Roger 858 Dec 7, 2022
    Android library contain custom realisation of EditText component for masking and formatting input text

    Masked-Edittext Masked-Edittext android library EditText widget wrapper add masking and formatting input text functionality. Install Maven <dependency

    Evgeny Safronov 600 Nov 29, 2022
    library to implement and render emojis For Android

    Release Notes SuperNova-Emoji SuperNova-Emoji is a library to implement and render emojis. Minimum SDK Level: 9 (2.3) Contact Java Usage To use defaul

    Hani Al-momani 360 Jan 3, 2023
    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
    An extension of Android's TextView, EditText and Button that let's you use the font of your choice

    AnyTextView (deprecated) Note: AnyTextView is no longer being maintained. I recommend replacing AnyTextView with the Calligraphy library instead. Frus

    Hans Petter Eide 165 Nov 11, 2022
    Add text masking functionality to Android EditText. It will prevent user from inserting not allowed signs, and format input as well.

    MaskFormatter MaskFormatter adds mask functionality to your EditText. It will prevent user from inserting not allowed signs, and format input as well.

    Azimo Labs 161 Nov 25, 2022