{"id":20031137,"url":"https://github.com/qyxxjd/commonadapter","last_synced_at":"2025-08-20T16:32:00.539Z","repository":{"id":88999519,"uuid":"53468518","full_name":"qyxxjd/CommonAdapter","owner":"qyxxjd","description":"一个适用于ListView/GridView/RecyclerView的Adapter库,简化大量重复代码,支持多种布局,可自定义图片加载的实现。","archived":false,"fork":false,"pushed_at":"2018-02-05T07:52:15.000Z","size":920,"stargazers_count":218,"open_issues_count":1,"forks_count":56,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-07T17:53:50.151Z","etag":null,"topics":["adapter","android","common","listview","recyclerview"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qyxxjd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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":"2016-03-09T04:37:48.000Z","updated_at":"2023-03-31T07:25:04.000Z","dependencies_parsed_at":"2023-06-26T02:04:27.892Z","dependency_job_id":null,"html_url":"https://github.com/qyxxjd/CommonAdapter","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/qyxxjd/CommonAdapter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qyxxjd%2FCommonAdapter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qyxxjd%2FCommonAdapter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qyxxjd%2FCommonAdapter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qyxxjd%2FCommonAdapter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qyxxjd","download_url":"https://codeload.github.com/qyxxjd/CommonAdapter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qyxxjd%2FCommonAdapter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271349652,"owners_count":24744321,"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-08-20T02:00:09.606Z","response_time":69,"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":["adapter","android","common","listview","recyclerview"],"created_at":"2024-11-13T09:31:09.892Z","updated_at":"2025-08-20T16:32:00.214Z","avatar_url":"https://github.com/qyxxjd.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-CommonAdapter-brightgreen.svg?style=flat)](http://android-arsenal.com/details/1/3727)\n[ ![Download](https://api.bintray.com/packages/xxjd/maven/CommonAdapter/images/download.svg) ](https://bintray.com/xxjd/maven/CommonAdapter/_latestVersion)\n\n- 简化大量重复代码\n- 支持多布局\n- 自定义图片加载\n- 常用数据操作\n- view复用\n- RecyclerView item 点击和长按事件\n\n\n![](https://github.com/qyxxjd/CommonAdapter/blob/master/screenshots/main.png)  ![](https://github.com/qyxxjd/CommonAdapter/blob/master/screenshots/simple.png)  ![](https://github.com/qyxxjd/CommonAdapter/blob/master/screenshots/multiple.png)\n\n\n## gradle依赖\n\n```gradle\ndependencies {\n    implementation 'com.classic.adapter:commonadapter:2.0'\n    implementation 'com.android.support:recyclerview-v7:27.0.2'\n}\n```\n\n## 开始使用\n\nListView/GridView 使用示例\n```java\nList\u003cNews\u003e newsList = ...;\n//单布局文件\nlistView = (ListView) findViewById(R.id.listview);\nlistView.setAdapter(new CommonAdapter\u003cNews\u003e(context,\n    //item布局文件\n    R.layout.item_none_picture, newsList ) {\n    @Override public void onUpdate(BaseAdapterHelper helper, News item, int position) {\n        //BaseAdapterHelper详细用法，见下方\n\n        helper.setText(R.id.xxx, item.getTitle())\n               //1.如果已配置全局图片加载，这里可以不设置。全局图片加载配置见下方\n               //2.有些项目可能使用多个图片加载库，这里可以针对当前adapter设置图片加载的实现方式，详见demo\n              .setImageLoad(new GlideImageLoad())\n              .setImageUrl(R.id.xxx,item.getCoverUrl());\n    }\n});\n\n//多布局文件\nprivate final class MultipleLayoutAdapter extends CommonAdapter\u003cNews\u003e{\n\n    public MultipleLayoutAdapter(Context context, int layoutResId, List\u003cNews\u003e data) {\n        super(context, layoutResId, data);\n    }\n    //多种布局重写此方法即可\n    @Override public int getLayoutResId(News item, int position) {\n        int layoutResId = -1;\n        switch (item.getNewsType()){\n            case News.TYPE_NONE_PICTURE: //布局样式一\n                layoutResId = R.layout.item_none_picture;\n                break;\n            case News.TYPE_SINGLE_PICTURE: //布局样式二\n                layoutResId = R.layout.item_single_picture;\n                break;\n            case News.TYPE_MULTIPLE_PICTURE: //布局样式三\n                layoutResId = R.layout.item_multiple_picture;\n                break;\n\n            更多的布局样式 ...\n        }\n        return layoutResId;\n    }\n\n    @Override public void onUpdate(BaseAdapterHelper helper, News item, int position) {\n        switch (item.getNewsType()){\n            case News.TYPE_NONE_PICTURE: //布局样式一\n                helper.setText(R.id.xxx, item.getTitle())\n                      .setImageUrl(R.id.xxx,item.getCoverUrl());\n                break;\n            case News.TYPE_SINGLE_PICTURE: //布局样式二\n                helper.setText(R.id.xxx, item.getTitle())\n                      .setImageUrl(R.id.xxx,item.getCoverUrl());\n                break;\n            case News.TYPE_MULTIPLE_PICTURE: //布局样式三\n                helper.setText(R.id.xxx, item.getTitle())\n                      .setImageUrl(R.id.xxx,item.getCoverUrl());\n                break;\n\n            更多的布局样式 ...\n        }\n    }\n}\n```\nRecyclerView 使用示例\n\n[使用 DiffUtil 高效更新 RecyclerView 示例代码，点这里](https://github.com/qyxxjd/CommonAdapter/blob/master/app/src/main/java/com/classic/adapter/simple/activity/RecyclerViewSimpleActivity.java)\n\n```java\nList\u003cNews\u003e newsList = ...;\n//单布局文件\nrecyclerView = (RecyclerView) findViewById(R.id.recyclerview);\nrecyclerView.setLayoutManager(new LinearLayoutManager(this));\nrecyclerView.setHasFixedSize(true);\nrecyclerView.setItemAnimator(new DefaultItemAnimator());\nnewsAdapter = new NewsAdapter(this, R.layout.item_none_picture, newsList);\nrecyclerView.setAdapter(newsAdapter);\n\nprivate class NewsAdapter extends CommonRecyclerAdapter\u003cNews\u003e{\n\n    public NewsAdapter(Context context, int layoutResId, List\u003cNews\u003e data) {\n        super(context, layoutResId, data);\n    }\n\n    @Override public void onCreate(RecyclerView.ViewHolder viewHolder, BaseAdapterHelper helper) {\n        // ViewHolder创建时回调\n    }\n\n    @Override public void onUpdate(BaseAdapterHelper helper, News item, int position) {\n        helper.setText(R.id.xxx, item.getTitle())\n              .setImageUrl(R.id.xxx,item.getCoverUrl());\n    }\n}\n\n//多布局文件\nprivate final class MultipleLayoutAdapter extends CommonRecyclerAdapter\u003cNews\u003e{\n\n    public MultipleLayoutAdapter(Context context, int layoutResId, List\u003cNews\u003e data) {\n        super(context, layoutResId, data);\n    }\n\n    @Override public void onCreate(RecyclerView.ViewHolder viewHolder, BaseAdapterHelper helper) {\n        // ViewHolder创建时回调\n    }\n\n    //多种布局重写此方法即可\n    @Override public int getLayoutResId(News item, int position) {\n        int layoutResId = -1;\n        switch (item.getNewsType()){\n            case News.TYPE_NONE_PICTURE: //布局样式一\n                layoutResId = R.layout.item_none_picture;\n                break;\n            case News.TYPE_SINGLE_PICTURE: //布局样式二\n                layoutResId = R.layout.item_single_picture;\n                break;\n            case News.TYPE_MULTIPLE_PICTURE: //布局样式三\n                layoutResId = R.layout.item_multiple_picture;\n                break;\n\n            更多的布局样式 ...\n        }\n        return layoutResId;\n    }\n\n    @Override public void onUpdate(BaseAdapterHelper helper, News item, int position) {\n        switch (item.getNewsType()){\n            case News.TYPE_NONE_PICTURE: //布局样式一\n                helper.setText(R.id.xxx, item.getTitle())\n                      .setImageUrl(R.id.xxx,item.getCoverUrl());\n                break;\n            case News.TYPE_SINGLE_PICTURE: //布局样式二\n                helper.setText(R.id.xxx, item.getTitle())\n                      .setImageUrl(R.id.xxx,item.getCoverUrl());\n                break;\n            case News.TYPE_MULTIPLE_PICTURE: //布局样式三\n                helper.setText(R.id.xxx, item.getTitle())\n                      .setImageUrl(R.id.xxx,item.getCoverUrl());\n                break;\n\n            更多的布局样式 ...\n        }\n    }\n}\n```\n\nRecyclerView 点击事件\n```java\ncommonRecyclerAdapter.setOnItemClickListener(this) // 设置 item 点击事件\n                     .setOnItemLongClickListener(this) // 设置 item 长按事件\n                     // 设置 Child view 的点击、长按、Touch事件(方式一)\n                     // OnChildViewClickListener 、 OnChildViewLongClickListener 、 OnChildViewTouchListener\n                     .addChildViewListener(R.id.viewId, listener);\n```\n\nBaseAdapterHelper 使用示例\n```java\nhelper.setText(R.id.viewId, text)\n      .setTag(R.id.viewId, objectTag)\n      .setAlpha(R.id.viewId, 0.6f)\n      .setBackgroundColor(R.id.viewId, R.color.colorResId)\n      .setBackgroundRes(R.id.viewId, R.drawable.drawableResId)\n      .setChecked(R.id.viewId, true)\n      .setImageBitmap(R.id.viewId, bitmap)\n      .setImageDrawable(R.id.viewId, drawable)\n      .setImageResource(R.id.viewId, R.drawable.drawableResId)\n      .setImageUrl(R.id.viewId, url)\n      .setProgress(R.id.viewId, progress)\n      .setProgress(R.id.viewId, progress, max)\n      .setRating(R.id.viewId, rating)\n      .setRating(R.id.viewId, rating, max)\n      .setTextColor(R.id.viewId, R.color.colorResId)\n      .setTextColorRes(R.id.viewId, R.color.colorResId)\n      .setTextColorRes(R.id.viewId, R.color.colorResId, theme)\n      //TextView添加超链接，更多属性参考：android.text.util.Linkify#addLinks(TextView text, int mask)\n      .addLinks(R.id.viewId, Linkify.ALL)\n      //效果同上\n      .addAllLinks(R.id.viewId)\n      //单个TextView设置Typeface\n      .setTypeface(R.id.viewId, typeface)\n      //多个TextView设置Typeface\n      .setTypeface(typeface, R.id.xxx1, R.id.xxx2, R.id.xxx3, ...)\n      .setVisible(R.id.viewId, View.VISIBLE)\n      //ProgressBar设置Max\n      .setMax(R.id.viewId, max)\n      //ListView、RecyclerView设置adapter\n      .setAdapter(R.id.viewId, adapter)\n      // 设置 Child view 的点击、长按、Touch事件(方式二)\n      .setOnTouchListener(R.id.viewId, onTouchListener)\n      .setOnClickListener(R.id.viewId, onClickListener)\n      .setOnLongClickListener(R.id.viewId, onLongClickListener)\n      .setOnItemClickListener(R.id.viewId, onItemClickListener)\n      .setOnItemLongClickListener(R.id.viewId, onItemLongClickListener)\n      .setOnItemSelectedClickListener(R.id.viewId, onItemSelectedListener);\n\n//获取item的convertView\nView convertView = helper.getView();\n\n//如果上面的属性不够用,可以通过getView(viewId)拿到View,然后进行属性设置\nView childView = helper.getView(R.id.viewId);\n\n```\n\n配置全局图片加载的实现类\n```java\npublic class YourApplication extends Application {\n\n    @Override public void onCreate() {\n        super.onCreate();\n\n        ...\n\n        ImageLoad imageLoadImpl = new GlideImageLoad();\n        Adapter.config(new Adapter.Builder().setImageLoad(imageLoadImpl));\n    }\n}\n```\n\n自定义图片加载\n```java\npublic class YourXXX implements ImageLoad {\n\n    @Override public void load(Context context, ImageView imageView, String imageUrl) {\n\n        //使用Glide加载图片\n        Glide.with(context).load(imageUrl).into(imageView);\n\n        or\n\n        //使用Picasso加载图片\n        Picasso.with(context).load(url).into(imageView);\n\n        or\n\n        Fresco\n        Android-Universal-Image-Loader\n        自定义\n        ...\n    }\n}\n```\n\n常用的数据操作\n```java\n//CommonAdapter、CommonRecyclerAdapter都实现了IData接口，里面包含了一些常用的数据操作\n\nvoid add(T elem);\n\nvoid addAll(List\u003cT\u003e elem);\n\nvoid set(T oldElem, T newElem);\n\nvoid set(int index, T elem);\n\nvoid remove(T elem);\n\nvoid remove(int index);\n\nvoid replaceAll(List\u003cT\u003e elem);\n\nboolean contains(T elem);\n\nvoid clear();\n\n```\n\n## 感谢\n\n[base-adapter-helper](https://github.com/JoanZapata/base-adapter-helper)\n\n## 关于\n\n* Blog: [http://blog.csdn.net/qy1387](http://blog.csdn.net/qy1387)\n* Email: [pgliubin@gmail.com](http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme\u0026email=pgliubin@gmail.com)\n\n## License\n\n```\nCopyright 2015 classic\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqyxxjd%2Fcommonadapter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqyxxjd%2Fcommonadapter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqyxxjd%2Fcommonadapter/lists"}