美文网首页
2019-04-11Android泛型化使用

2019-04-11Android泛型化使用

作者: gdlooker | 来源:发表于2019-04-11 10:03 被阅读0次

示例代码如下:

package com.example.dell.basebindingadaptertest.act;

import android.arch.lifecycle.ViewModel;
import android.arch.lifecycle.ViewModelProvider;
import android.arch.lifecycle.ViewModelStore;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
import android.support.annotation.CallSuper;
import android.support.annotation.CheckResult;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import com.example.dell.basebindingadaptertest.constant.Constant;
import com.example.dell.basebindingadaptertest.utils.ClassUtil;
import com.example.dell.basebindingadaptertest.utils.StatusBarUtil;
import com.trello.rxlifecycle2.LifecycleProvider;
import com.trello.rxlifecycle2.LifecycleTransformer;
import com.trello.rxlifecycle2.RxLifecycle;
import com.trello.rxlifecycle2.android.ActivityEvent;
import com.trello.rxlifecycle2.android.RxLifecycleAndroid;

import io.reactivex.Observable;
import io.reactivex.subjects.BehaviorSubject;

/**
 * Created by chentao
 * Date:2019/3/19
 * Description:如果这里继承的是RxActivity 因为RxActivity的父类是Activity它没有提供getSuppportFragmentManager方法
 *  所以这里要继承自FragmentActivity或者AppCompatActivity
 */
public abstract class JavaMvvmActivity<VM extends ViewModel,T extends ViewDataBinding> extends AppCompatActivity implements LifecycleProvider<ActivityEvent> {

    protected final String TAG="gdchent";
    protected T binding=null ;
    protected ViewModel VM;
    protected abstract int getLayloutId() ;
    protected Context context;
    protected abstract  void init();
    protected SharedPreferences sp=null;
    //实现生命周期控制
    private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();

    @NonNull
    @CheckResult
    public final Observable<ActivityEvent> lifecycle() {
        return lifecycleSubject.hide();
    }



    @Override
    @NonNull
    @CheckResult
    public <T> LifecycleTransformer<T> bindUntilEvent(ActivityEvent event) {
        return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
    }

    @NonNull
    @CheckResult
    @Override
    public <T> LifecycleTransformer<T> bindToLifecycle() {
        return RxLifecycleAndroid.bindActivity(lifecycleSubject);
    }

    @Override
    @CallSuper
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding=DataBindingUtil.setContentView(this,getLayloutId());
        context=this;
        sp=getSharedPreferences(Constant.SP_NAME, Context.MODE_PRIVATE);
        initViewModel();
        init();
        setOnlickListener();
        lifecycleSubject.onNext(ActivityEvent.CREATE);
        //ContextCompat.getColor(this,android.R.color.holo_red_dark
        StatusBarUtil.setTranslucentForImageView(this,binding.getRoot() );
    }
   //在基类 通过泛型初始化ViewModel利用反射
    protected void initViewModel(){
        Class<ViewModel> viewModelClass=ClassUtil.getViewModel(this);
        if(viewModelClass!=null) {
            ViewModelStore viewModelStore=new ViewModelStore();
            //通过viewModelProvider
            ViewModelProvider viewModelProvider = new ViewModelProvider(viewModelStore,new ViewModelProvider.AndroidViewModelFactory(getApplication()));
            VM=viewModelProvider.get(viewModelClass);
        }
    }

    protected void setOnlickListener(){}

    //打开Activity
    protected void startActivity(Context context,Class clazz){
        Intent intent=new Intent(context,clazz);
        startActivity(intent);
    }
    protected void startActivityAndBundle(Context context,Class clazz,Bundle bundle){
        Intent intent=new Intent(context,clazz);
        intent.putExtra(Constant.BUNDLE_NAME,bundle);
        startActivity(intent);
    }


    @Override
    @CallSuper
    protected void onStart() {
        super.onStart();
        lifecycleSubject.onNext(ActivityEvent.START);
    }

    @Override
    @CallSuper
    protected void onResume() {
        super.onResume();
        lifecycleSubject.onNext(ActivityEvent.RESUME);
    }

    @Override
    @CallSuper
    protected void onPause() {
        lifecycleSubject.onNext(ActivityEvent.PAUSE);
        super.onPause();
    }

    @Override
    @CallSuper
    protected void onStop() {
        lifecycleSubject.onNext(ActivityEvent.STOP);
        super.onStop();
    }

    @Override
    @CallSuper
    protected void onDestroy() {
        lifecycleSubject.onNext(ActivityEvent.DESTROY);
        super.onDestroy();
    }

}

泛型化工具代码:

public class ClassUtil {

    /**
     * 获取泛型ViewModel的class对象
     */
    public static <T> Class<T> getViewModel(Object obj) {
        Class<?> currentClass = obj.getClass();
        Class<T> tClass = getGenericClass(currentClass, AndroidViewModel.class);
        if (tClass == null || tClass == AndroidViewModel.class || tClass == NoViewModel.class) {
            return null;
        }
        return tClass;
    }

    private static <T> Class<T> getGenericClass(Class<?> klass, Class<?> filterClass) {
        Type type = klass.getGenericSuperclass();
        if (type == null || !(type instanceof ParameterizedType)) return null;
        ParameterizedType parameterizedType = (ParameterizedType) type;
        Type[] types = parameterizedType.getActualTypeArguments();
        for (Type t : types) {
            Class<T> tClass = (Class<T>) t;
            if (filterClass.isAssignableFrom(tClass)) {
                return tClass;
            }
        }
        return null;
    }
}

例如子类Act代码如下:

/**
 * 主页面一个Framelayout
 * 实现逻辑
 */
public class JavaMainActivity extends JavaMvvmActivity<JavaMainViewModel,ActivityJavaMainBinding> {

    @Override
    protected int getLayloutId() {
        return R.layout.activity_java_main;
    }

    @Override
    protected void init() {
        
        //binding.setVm(VM);
        binding.setVariable(BR.vm,VM);
        //Framelyaout 添加子的Fragment 动态添加
        /**
         * 实现思路是 通过FragmentManager来动态添加
         */
        //第一步 获取FragmentManager
        FragmentManager fm =getSupportFragmentManager();

        ViewPagerFragment viewPagerFragment = new ViewPagerFragment();
        FragmentTransaction ft = fm.beginTransaction();
        ft.add(R.id.container, viewPagerFragment, ViewPagerFragment.VP_FRAGMENT_TAG);
        ft.commit();
    }
}

通过xml绑定ViewModel示例代码如下:

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android">

     <data>
            <variable
                name="vm"
                type="com.example.dell.basebindingadaptertest.viewmodel.JavaMainViewModel"  />
     </data>
   <FrameLayout
       android:id="@+id/container"
       android:layout_width="match_parent"
       android:layout_height="match_parent">

   </FrameLayout>
</layout>

总结:每个Act或者Frag绑定一个viewModel ,一般Viewmodel是跟xml进行绑定,所以初始化viewModel在获取viewDatabinding之后
详细代码参见github传送门:
https://github.com/gdchent/BaseBindingAdapter

相关文章

  • 2019-04-11Android泛型化使用

    示例代码如下: 泛型化工具代码: 例如子类Act代码如下: 通过xml绑定ViewModel示例代码如下: 总结:...

  • 四、Java高级--1、泛型

    泛型定义:数据类型参数化,提前定义好集合中放入什么类型集合框架中没使用泛型和使用泛型的比较 泛型规则和限制1、泛型...

  • Rust系列-2.特征Trait

    泛型 泛型是一种参数化多态,使用泛型可以编写更为抽象的代码,减少工作量,简单来说,泛型就是把一个泛化的类型作为参数...

  • Java 泛型

    01.泛型 泛型的本质是参数化类型,使用泛型可以获得更高级的抽象。 Java泛型(generics)是JDK 5 ...

  • 泛型高级进阶

    一、 限制泛型可用类型 1、自定义泛型类时,默认可以使用任何类型来实例化泛型变量。但是如果想要限制使用的泛型类别,...

  • Java 泛型

    为什么使用泛型 泛型就是“参数化类型”,就是把类型当作参数传递 对于为什么要使用泛型,我们先来举几个栗子 ?1: ...

  • swift泛型

    泛型 泛型可以将类型参数化,提高代码复用率,减少代码量 使用泛型实现栈 关联类型(Associated Type)...

  • spring 泛型处理

    java 泛型基础 泛型类型:泛型类型是在类型上参数化的泛型类或接口 泛型使用场景编译时前类型检查。定义为 Col...

  • 31,泛型

    泛型就是参数化类型 适用于多种数据类型执行相同的代码泛型中的类型在使用时指定泛型归根到底就是“模版”优点:使用泛型...

  • 泛型(一)

    1. Java中的泛型是什么 ? 使用泛型的好处是什么? 泛型是Java SE 1.5的新特性,泛型的本质是参数化...

网友评论

      本文标题:2019-04-11Android泛型化使用

      本文链接:https://www.haomeiwen.com/subject/wvpziqtx.html