{"id":17688740,"url":"https://github.com/boybeak/adapter-x","last_synced_at":"2025-03-30T21:42:49.826Z","repository":{"id":87642707,"uuid":"156967727","full_name":"boybeak/Adapter-X","owner":"boybeak","description":"Adapter library for AndroidX","archived":false,"fork":false,"pushed_at":"2019-05-17T06:10:31.000Z","size":313,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-06T01:48:08.155Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/boybeak.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-10T09:45:36.000Z","updated_at":"2019-05-17T06:10:33.000Z","dependencies_parsed_at":null,"dependency_job_id":"b2ccacdc-2138-48f1-9360-7717bcc7a9a6","html_url":"https://github.com/boybeak/Adapter-X","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boybeak%2FAdapter-X","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boybeak%2FAdapter-X/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boybeak%2FAdapter-X/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boybeak%2FAdapter-X/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/boybeak","download_url":"https://codeload.github.com/boybeak/Adapter-X/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246385410,"owners_count":20768668,"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","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":[],"created_at":"2024-10-24T11:45:19.424Z","updated_at":"2025-03-30T21:42:49.810Z","avatar_url":"https://github.com/boybeak.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Adapter\n\nThis library can easily bind layout and ViewHolder.\n\n## Installation [ ![Download](https://api.bintray.com/packages/boybeak/nulldreams/adapter/images/download.svg) ](https://bintray.com/boybeak/nulldreams/adapter/_latestVersion)\n\n```groovy\nimplementation 'com.github.boybeak:adapter:x.y.z'\nannotationProcessor 'com.github.boybeak:adapter-compiler:x.y.z'\n```\n\nThis library must work with data binding. So, you need enable data binding in your project.\n\nIn your project's build.gradle, you need to enable dataBinding and add annotationProcessor.\n\n```groovy\nandroid {\n    dataBinding {\n        enabled = true\n    }\n}\n\n\ndependencies {\n    implementation fileTree(include: ['*.jar'], dir: 'libs')\n    annotationProcessor \"com.android.databinding:compiler:$gradle_version\"\n}\n```\n\n\u003e Maybe you need change **annotationProcessor** into **kapt**. \n\u003e\n\u003e ```groovy\n\u003e apply plugin: 'kotlin-kapt'\n\u003e ```\n\u003e\n\u003e Don't forget apply this plugin.\n\nAfter this preparation, we start our own coding.\n\n## Usage\n\nA POJO class name [Crash.kt](https://github.com/boybeak/Adapter/blob/master/app/src/main/java/com/github/boybeak/autobind/Crash.kt)\n\n```kotlin\nclass Crash() : Parcelable {\n\n    var sdk_int: Int = 0\n    var id: String? = null\n    var incermental: String? = null\n    var model: String? = null\n    var simple_crash_info: String? = null\n    var manufacturer: String? = null\n    var code_name: String? = null\n    var app_version: String? = null\n    var role: Int? = null\n    var admin_id: Int = 0\n    var name: String? = null\n    var crash_info: String? = null\n    var crash_time: String? = null\n    var studio_id: String? = null\n    var studio_name: String? = null\n\n    val causeBy: String\n        get() = \"Cause by:$simple_crash_info\".trim()\n\n    val manufacturerAndModel: String\n        get() = \"$manufacturer / $model\"\n\n    val nameWithRole: String\n        get() = \"$name · ${when(role){1-\u003e\"T\" 2-\u003e\"S\" 3-\u003e\"F\" else -\u003e \"Unknown\"}}\"\n\n    fun formattedCrashInfo(): CharSequence {\n        if (crash_info == null) {\n            return \"\"\n        }\n\n        return HtmlCompat.fromHtml(\n                crash_info!!.trim().replace(\"\\n\", \"\u003cp\u003e\").replace(\":\", \":\u003cb\u003e\")\n                        .replace(\")\", \"\u003c/b\u003e)\"), HtmlCompat.FROM_HTML_MODE_COMPACT)\n    }\n}\n```\n\n```kotlin\nadapter = DataBindingAdapter(this)\nrecycler_view.adapter = adapter\n```\n\nBind Adapter and `RecyclerView` as usual. \n\n\u003e Attenetion: the adapter is **DataBindingAdapter**. Or if you wanna custom your own adapter logic, just define custom class and extend [AbsAdapter](https://github.com/boybeak/Adapter/blob/master/adapter/src/main/java/com/github/boybeak/adapter/AbsAdapter.java)\n\nThen define a ViewHolder class\n\n```kotlin\n@HolderInfo(layoutId = R.layout.layout_crash,\n        layoutInfo = LayoutInfo(name = \"CrashImpl\", source = Crash::class))\nclass CrashHolder(b: LayoutCrashBinding) : AbsDataBindingHolder\u003cCrashImpl, LayoutCrashBinding\u003e(b) {\n    override fun onBindData(context: Context, layout: CrashImpl, position: Int, adapter: RecyclerView.Adapter\u003cRecyclerView.ViewHolder\u003e) {\n        binding().crash = layout.source\n        binding().root.setOnClickListener {\n            Intent(context, CrashInfoActivity::class.java)\n                    .putExtra(\"crash\", layout.source)\n                    .startActivity(context)\n        }\n    }\n}\n```\n\nThe magic part is the annotation **@HolderInfo**. Add this annotion to a class and please don't extend AbsDataBindingHolder at this moment. Then build this project. After building complete, A java class named CrashImpl is generated at the same package of CrashHolder. And at this moment, you can make the CrashHolder extend AbsDataBindingHolder and override onBindData method.\n\n\u003e If you do not want an auto generated LayoutImpl java class. Leave the **@LayoutInfo** empty, And make a LayoutImpl class yourself.\n\u003e\n\u003e ```java\n\u003e public class CrashImpl extends AbsLayoutImpl\u003cCrash\u003e {\n\u003e   public CrashImpl(Crash source) {\n\u003e     super(source);\n\u003e   }\n\u003e \n\u003e   @Override\n\u003e   public int getLayout() {\n\u003e     return R.layout.layout_crash;\n\u003e   }\n\u003e }\n\u003e ```\n\u003e\n\u003e Make sure of **getLayout** method returns the same value of **@HolderInfo.layotuId** field.\n\n\u003e If you do not want to use **@HolderInfo**, you can just define a CrashImpl class yourself .\n\u003e\n\u003e ```java\n\u003e public class CrashImpl extends AbsLayoutImpl\u003cCrash\u003e {\n\u003e   public CrashImpl(Crash source) {\n\u003e     super(source);\n\u003e   }\n\u003e \n\u003e   @Override\n\u003e   public int getLayout() {\n\u003e     return R.layout.layout_crash;\n\u003e   }\n\u003e     \n\u003e   @Override\n\u003e   public Class\u003c? extends AbsDataBindingHolder\u003e getHolderClass() {\n\u003e     return CrashHolder.class;\n\u003e   }\n\u003e }\n\u003e ```\n\u003e\n\u003e Don't forget override **getHolderClass** method. If you choose this way, what you need know is this can lead to a slow performance because of runtime class reflection when creating holder.\n\nAdd Crash class to adapter.\n\n```kotlin\nadapter.addAll(crashList, object : Converter\u003cCrash, CrashImpl\u003e {\n    override fun convert(data: Crash?, adapter: DataBindingAdapter): CrashImpl {\n        return CrashImpl(data)\n    }\n\n}).autoNotify()\n```\n\n\n\n## @HolderInfo Details\n\n**HolderInfo**\n\n```java\npublic @interface HolderInfo {\n    int layoutId();\t\t\t//The layout you wanna bind with\n    LayoutInfo layoutInfo();\t//The LayoutImpl class info\n}\n```\n\n**LayoutInfo**\n\n```java\npublic @interface LayoutInfo {\n    String name() default \"\";\t\t//The LayoutImpl class name\n    Class\u003c?\u003e source() default void.class;\t//The sorce class, such as Crash.class\n    Class\u003c?\u003e[] sourceGenerics() default {};\t//The sorce's generic types, such as String for Crash\u003cString\u003e if Crash has generics\n\n    Constructor[] constructors() default {}; //Constructors of LayoutImpl\n\n    boolean supportSelect() default false;\t// support select or not\n    boolean selectable() default false;\t\t// can be select or not, if you want set to true, you need set supportSelect to true\n}\n```\n\n**Constructor**\n\n```java\npublic @interface Constructor {\n    boolean useId() default false; // true if you wan use super(source, id), then you can define yourself id for layoutimpl\n    Member[] members() default {};\t// Members of constructor method\n}\n```\n\n**Member**\n\n```java\npublic @interface Member {\n    String name();\t// the parameter name\n    Class\u003c?\u003e type();\t// the parameter type, such as List.class\n    Class\u003c?\u003e[] generics() default {};\t//the parameter's generics, such as {String.class}\n}\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboybeak%2Fadapter-x","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fboybeak%2Fadapter-x","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboybeak%2Fadapter-x/lists"}