提供了下面两个核心的功能。
1.获取其他module的功能Provider接口
2.获取其他module的ViewHolder实例
组件化开发,一个核心点是每个module的功能和View应该和其他的module解耦。一个module如果想调用另一个module的功能或者复用View,可以通过接口的方式调用。
简单便捷的调用其他module的功能接口和ViewHolder实例
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'
}
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);
}importcom.leaf.magic.annotation.Provider;
@Provider(provider = MyTestProvider.class)
publicclassMyTestProviderImplimplementsMyTestProvider {
privateintcount = 100;
@OverridepublicStringgetCount() {
count += 100;
return"MyTestProvider count = " + count;
}
}
//同一个接口 可以有不同的实现 需要通过type区分@Provider(provider = MyTestProvider.class,type=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))
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);
}