Skip to content

Repository files navigation

magic

提供了下面两个核心的功能。
1.获取其他module的功能Provider接口
2.获取其他module的ViewHolder实例
组件化开发,一个核心点是每个module的功能和View应该和其他的module解耦。一个module如果想调用另一个module的功能或者复用View,可以通过接口的方式调用。

特点

简单便捷的调用其他module的功能接口和ViewHolder实例

使用:

在需要使用的module的build gradle中增加moduleName和两个依赖

defaultConfigjavaCompileOptions {
annotationProcessorOptions {
includeCompileClasspath = truearguments = [moduleName: project.getName()]
}
}
}
dependencies {
implementation'com.leaf:magic-provider:1.3.0'implementation'com.leaf:magic-compiler:1.3.0'
}

如果是kotlin的module:

dependencies {
implementationfileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:${KOTLIN_VERSION}"implementation'com.leaf:magic-provider:1.3.0'kapt'com.leaf:magic-compiler:1.3.0'
}

1. 需要注解实现的接口

publicinterfaceMyTestProvider {
StringgetCount();
}
//kotlin:interfaceDemoProvider {
fungetDemoName(): String
}
ViewHolder接口 必须有BaseViewHolder(LayoutInflater layoutInflater, ViewGroup root, boolean attachToRoot)构造方法
publicabstractclassBaseViewHolderextendsRecyclerView.ViewHolder {
publicBaseViewHolder(ViewitemView) {
super(itemView);
}
publicBaseViewHolder(LayoutInflaterlayoutInflater, ViewGrouproot, booleanattachToRoot) {
super(null);
}
publicabstractvoidbindView(ObjectbaseData, intposition);
}

2. 注解接口的实现 可以通过type区分相同接口的不同实例

importcom.leaf.magic.annotation.Provider;
@Provider(provider = MyTestProvider.class)
publicclassMyTestProviderImplimplementsMyTestProvider {
privateintcount = 100;
@OverridepublicStringgetCount() {
count += 100;
return"MyTestProvider count = " + count;
}
}
//同一个接口 可以有不同的实现 需要通过type区分@Provider(provider = MyTestProvider.classtype=100)
publicclassMyTestProviderImplimplementsMyTestProvider {
privateintcount = 100;
@OverridepublicStringgetCount() {
count += 100;
return"MyTestProvider count = " + count;
}
}
//kotlinimportcom.leaf.magic.annotation.Provider@Provider(provider = DemoProvider::class)
classDemoProviderImpl : DemoProvider {
overridefungetDemoName(): String {
return"module name is demo"
}
}
ViewHolder的实现类 必须有构成方法ViewHolder(LayoutInflater layoutInflater, ViewGroup root, boolean attachToRoot)
importcom.leaf.magic.annotation.Provider;
@Provider(provider = BaseViewHolder.class, type = 100)
publicclassMyViewHolderextendsBaseViewHolder {
privateTextViewtitleView;
publicMyViewHolder(LayoutInflaterlayoutInflater, ViewGrouproot, booleanattachToRoot) {
this(layoutInflater.inflate(R.layout.my_viewholder_layout, root, attachToRoot));
}
publicMyViewHolder(ViewitemView) {
super(itemView);
titleView = itemView.findViewById(R.id.title);
}
@OverridepublicvoidbindView(ObjectbaseData, intposition) {
if (baseDatainstanceofString) {
Stringtitle = (String) baseData;
Log.i("magic", "bindView " + title);
titleView.setText(title);
}
}
}
// kotlin的constructor(layoutInflater: LayoutInflater, root: ViewGroup?, attachToRoot: Boolean) :
this(layoutInflater.inflate(R.layout.my_viewholder_layout, root, attachToRoot))

3. 在需要的地方调用

首先在Application中初始化 Magic.getInstance(applicationContext).init()
1.每次创建新的实例:create(clazz)
2.没有实例就创建新实例 有就直接返回已经存在的:get(clazz)
3.同一个接口,通过type区分,可以产生不同的实例:create(clazz,type) get(clazz,type)
4.创建ViewHolder实例,通过type区分,可以产生不同的实例:createViewHolder(clazz,type)

4. 调用的实例

接口Provider的实例
MyTestProvidermyTestProvider1 = (MyTestProvider) Magic.getInstance().get(MyTestProvider.class);
if (myTestProvider1 != null) {
Log.i("Magic", "myTestProvider1: " + myTestProvider1.getCount());
textView1.setText(myTestProvider1.getCount());
}
MyTestProvidermyTestProvider2 = (MyTestProvider) Magic.getInstance().get(MyTestProvider.class);
if (myTestProvider2 != null) {
Log.i("Magic", "myTestProvider2: " + myTestProvider2.getCount());
textView2.setText(myTestProvider2.getCount());
}
MyTestProvidermyTestProvider3 = (MyTestProvider) Magic.getInstance().create(MyTestProvider.class);
if (myTestProvider3 != null) {
Log.i("Magic", "myTestProvider3: " + myTestProvider3.getCount());
textView3.setText(myTestProvider2.getCount());
}
// 获取type=100的MyTestProvider接口实例MyTestProvidermyTestProvider4 = (MyTestProvider) Magic.getInstance().create(MyTestProvider.class, 100);
if (myTestProvider4 != null) {
Log.i("Magic", "myTestProvider4: " + myTestProvider4.getCount());
textView4.setText(myTestProvider4.getCount());
}
DemoProviderdemoProvider = (DemoProvider) Magic.getInstance().get(DemoProvider.class);
if (demoProvider != null) {
Log.i("Magic", "demo module: " + demoProvider.getDemoName());
textView5.setText(demoProvider.getDemoName());
}
结果:
I/Magic: myTestProvider1: MyTestProvidercount = 200I/Magic: myTestProvider2: MyTestProvidercount = 400I/Magic: myTestProvider3: MyTestProvidercount = 200I/Magic: myTestProvider4: MyTestProviderImpl2count = 10000I/Magic: demomodule: modulenameisdemo

######接口ViewHolder的实例

BaseViewHolderbaseViewHolder = (BaseViewHolder) Magic.getInstance().createViewHolder(BaseViewHolder.class, 100, getLayoutInflater(), frameLayout, false);
if (baseViewHolder != null) {
baseViewHolder.bindView("titleForTest", 0);
frameLayout.addView(baseViewHolder.itemView);
}

About

No description, website, or topics provided.

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages