El vino, vino, vino con el BRVAH MVVM! No mire a la perdida

Nota: Este artículo contenido un poco más, para ver el conjunto artículo con la demo sólo se complementan entre sí. Espero que puedan ser paciente y leer, después de lo cual se sentirá el control realmente como para ayudarle a desarrollar un proyecto más racionalizado, la colección propuesta

Descripción frase primera de la función de este control:

El patrón MVVM BaseRecyclerViewAdapterHelper con la combinación perfecta para lograr una forma más cómoda y eficiente para cargar una lista para ayudarle a ahorrar mucho tiempo escribiendo adaptador complejo, hacen que el código sea más simple y elegante estructura del proyecto.

Esto decía Android Profecías de la comunidad: los desarrolladores de Android interfaz de usuario sólo tiene que utilizar la lista en la mitad superior del cielo. Nuestro desarrollo diario, la lista se utiliza en tan grande, una gran cantidad de la lista, significa que un gran número de adaptadores, pero también significa una cantidad mayor de la clase bean, diseño de producto y variedad de lógica compleja, por lo tanto, tiene una lista cómodo, rápido plantilla es demasiado importante. Ahora tiene 9020 años, y yo creo que tenemos el modo de MVC, MVP modo de transición, el patrón MVVM a ella, si no con el patrón MVVM, que están fuera de! (Esto no tiene sentido, se puede omitir sin mirar)

Debido a que nuestro proyecto es el patrón MVVM, a continuación, un viejo ex colegas Android escribieron un control que es capaz de lista con facilidad viewmodel unidas entre sí, por lo que el código para simplificar mucho. Pero también hay algunas desventajas, como es compatible con multi-diseño de unión, entonces yo estoy aquí de pie sobre los hombros de gigantes, controlará casi perfecto.

La premisa de la utilización de los controles, utilizando el modelo de desarrollo de proyectos MVVM, la lista de adaptadores es utilizar BRVAH

BaseRecyclerViewAdapterHelper adaptador universal (este control es compatible con el uso de la no-AndroidX y condiciones de uso AndroidX, ladrón íntima).

### Contenido
1 Proyecto Sitio
2 Inicio de visualización llamada
3, cómo confían
4, llaman propia animación BRVAH, y el patrón de la línea
5, la configuración de animación personalizada llamada, y el modo de rejilla
6, la realización de múltiples diseño, elemento lograr MultipleItem.
7, las implementaciones con varios diseños, elemento no implementa la invocación MultipleItem
8, cómo agregar cabeza y los pies múltiple con el modo de enlace de datos, y tienen sus propios eventos
9, de composición vacía y actualización desplegable
10, el arrastre de borrado
11, presione y arrastre
12, de deslizamiento y de prensa de arrastre de eliminación combinación
13, ExpandableItem, de disposiciones de usos múltiples escalables
14, refrescar desplegable, el portador LAC
15, la interfaz de imitación de chat, se carga de datos desde la parte inferior
16, una lista de uso dual, imitación Comida para llevar (incluso más listas)
17, es compatible con el uso de un adaptador para llamar a su propia
18, la lista de soporte deslizante

### direcciones de
ADO, la primera en la demo Github. A partir de la demo, podemos ver que el proyecto es magra

Si el proyecto no está utilizando AndroidX, por favor comer esta dirección:

https://github.com/CaesarShao/CSBrvahBinding

Si el proyecto utiliza AndroidX, por favor comer esta dirección:

https://github.com/CaesarShao/CSBrvahBindingX

hábito por defecto, en primer lugar en el mapa de nuevo, sobre todo dentro de la lógica del código:

En primer lugar, podemos mirar a mi biblioteca en CSBrvahBindingAdapter esta clase, que es a través del método de BindingAdapter, atado junto con una lista de adaptadores. Entonces CSItemBindingAdapter este adaptador, que es el núcleo de este adaptador de control, y el adaptador en, llamar a un método de unión de enlace de datos. Entonces podemos ver BaseBindingViewModel esta clase, la clase base es modelo de vista, que definirá propiedades y métodos, así como las solicitudes de red imitación combinado con la lista de acciones. Detrás mientras que la escritura de explicar.

Hay otro recordatorio, nos fijamos en el artículo, mantener la demo combinan comer, o puede ser que veamos un poco borrosa.

Estilo Inicio ###

Lista de captura de pantalla de ejemplos:

Inicio lista de invocación de diferentes maneras:

Muy simple, este es el contenido de la actividad, siempre y cuando el modelo de vista de unión, entonces model.load llamada (), las listas de carga de datos en él

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding = DataBindingUtil
    .setContentView<ActivityMainBinding>(this, R.layout.activity_main)
    val model = MainViewModel()
    binding.vm = model
    model.load()
    CSLog.Open()//测试用开启日志
}

Inicio del modelo de vista:

@Override//获取绑定的布局和数据
protected Map<Integer, CSBravhItemBinding> getItemBinding() {
    Map<Integer, CSBravhItemBinding> mp = new HashMap<>();
    mp.put(0, new CSBravhItemBinding(BR.bean, R.layout.item_main, BR.action, new Action()));
    return mp;
}

@Override//已经集成好的加载数据的方法
public void load() {
    load(getData());
}

//另外的点击事件动作,我为了方便这样写,也可以mvvm模式默认是写在data数据中
public class Action implements CSAction1<MainData> {
    @Override
    public void call(MainData param) {
        Intent intent = new Intent(FramGroble.INSTANCE.getTopActivity(), param.activity);
        FramGroble.INSTANCE.getTopActivity().startActivity(intent);
    }
}

//模拟网络请求的数据
private Flowable<List<MainData>> getData() {
    return Flowable.create(new FlowableOnSubscribe<List<MainData>>() {
        @Override
        public void subscribe(FlowableEmitter<List<MainData>> emitter) throws Exception {
            ArrayList<MainData> data = new ArrayList<>();
            data.add(new MainData("Animation,line,加载动画效果", AnimationActivity.class));
            data.add(new MainData("Animation,Grid,加载自定义动画效果", AnimationCustomActivity.class));
            data.add(new MainData("MultipleItem,line,多布局", MultipleLineActivity.class));
            data.add(new MainData("非MultipleItem,Grid,多布局,(不想继承MultiItemEntity,用自己的bean类)", NonMultipleActivity.class));
            data.add(new MainData("添加多个头部和尾部,有各自的数据,优雅", HeadFootActivity.class));
            data.add(new MainData("空布局及下拉刷新", EmptyRefreshActivity.class));
            data.add(new MainData("侧滑删除", SwipeActivity.class));
            data.add(new MainData("长按拖动,多布局", DragActivity.class));
            data.add(new MainData("可扩展的,多布局", ExpandActivity.class));
            data.add(new MainData("下拉刷新,上拉加载", LoadMoreLineActivity.class));
            data.add(new MainData("聊天界面,下拉加载", LoadMoreChatActivity.class));
            data.add(new MainData("2个列表的绑定,仿外卖", TwoListActivity.class));
            data.add(new MainData("用自己的适配器(继承万能适配器)", CustomAdapterActivity.class));
            emitter.onNext(data);
            emitter.onComplete();
        }
    }, BackpressureStrategy.BUFFER);
}

@Override//设置自定义item的间距
public RecyclerView.ItemDecoration onitemDecoration() {
    return new NormalLineDecoration(30, true);
}

modelo de vista, no hay llamadas lógicas complejas, sólo algunas de devolución de llamada. Inheritance largo BaseBindingViewModel <>, que es un conjunto de datos genérico, (disposición genérica múltiple se describe a continuación), por getItemBinding () se proporciona de devolución de llamada para cada elemento de la disposición y los datos de unión (datos puede unirse múltiple), en donde la clave está tipoElemento mapa tipo, si se trata de un diseño único, escribir 0 en él, si se trata de un multi-diseño, de acuerdo con tipoElemento tipo de escritura, mainActivity el artículo, además, se unen un evento de acción, mi lado se pone a punto haga clic en evento. devolución de llamada de carga () Invocar la carga (getData ()) para cargar los datos (aquí utilizo rxjava a los datos de carga de simular, y ahora el proyecto son, básicamente, combinada con el acceso a la red de adaptación y la solicitud rxjava). OnitemDecoration inferior () de devolución de llamada, el elemento se proporciona terreno de juego recyclerview. No es muy limpio lógica y clara.

En este momento, alguien le preguntará: Oh, antiguo matón honesto, ah, ¿por qué no ver la lista de adaptadores ah. Hey, el adaptador se ha empaquetado en BaseBindingViewModel en, no se preocupe, la parte trasera será de 11 mencionado, a continuación, vistazo a la disposición del archivo, super simple:

<data>
    <variable
        name="vm"
        type="com.caesar.brvahbinding.MainViewModel" />
</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:cs_brvah_Decoration="@{vm.itemDecoration}"
        app:cs_brvah_adapter="@{vm.bindingAdapter}"
         />
</LinearLayout>

Formato databinging no quiere decir, que, app: cs_brvah_adapter = "@ {} vm.bindingAdapter", es vinculante adaptadores modelo de vista, porque en BaseBindingViewModel se inicializan esta clase base, por lo que una referencia directa a ella . aplicación: cs_brvah_Decoration = "@ {} vm.itemDecoration" Se trata de la decoración de la unión, que ha sido ajustado intervalo para cada elemento en el anterior modelo de vista en, no una onitemDecoration () de devolución de llamada, puede personalizar.

¿Cómo, no es particularmente fácil. En la actualidad sólo una descripción breve, la próxima será lentamente a explicar más tarde, a la conveniencia de este control se reflejará más, hay no entienden puede ver una colección de ejemplos, entenderás.

Cómo hacer referencia a los controles

Entonces alguien le preguntará: Oh, antigua honesta matón ah, entonces cómo se basan los controles de modo conveniente que?

Muy simple, el build.gradle raíces en:

allprojects {
    repositories {
      ...
      maven { url 'https://jitpack.io' }
    }
  }

Entonces, si está utilizando AndroidX proyecto, se hace referencia a la dirección:

dependencies {
          implementation 'com.github.CaesarShao:CSBrvahBindingX:1.0.8'
  }

Si el proyecto no es compatible con AndroidX, se hace referencia a:

dependencies {
          implementation 'com.github.CaesarShao:CSBrvahBinding:1.0.8'
  }

Además, debido a que dependen de la versión del adaptador universal es com.github.CymChad: BaseRecyclerViewAdapterHelper: 02/09/50, por lo que proyectamos la mejor no inferior a la versión 2.9.50. De lo contrario, puede haber problemas de compatibilidad.

No es un ladrón íntima, dio a todos en cuenta. Pues bien explico uno por llamada entre uno específico, por favor paciencia para ver.

Llamada BRVAH propias animaciones y el modo de línea

Actividad de la llamada no hablo, muy simple, buscamos AnimationActivity esta llamada rutina de la clase, los primeros pegatinas de código:

public AdapterView.OnItemSelectedListener onItemClickListener = getOnItemCli();

//构造方法,里面可以设置基础属性
public AnimationViewModel() {
    super();
    //该viewmodel是演示效果,实际在构造方法中,直接调用即可,
    // animationType.set(BaseQuickAdapter.SLIDEIN_BOTTOM);
}

@Override
protected Map<Integer, CSBravhItemBinding> getItemBinding() {
    Map<Integer, CSBravhItemBinding> mp = new HashMap<>();
    mp.put(0, new CSBravhItemBinding(com.caesar.brvahbinding.BR.bean, R.layout.item_simple));
    return mp;
}

@Override
public void load() {
    load(CreateData.getSimpleData());
}

//这个是Spinner控件的OnItemSelectedListener的监听,在布局中绑定,当spinner使用时,会回调这个方法.
public AdapterView.OnItemSelectedListener getOnItemCli() {
    return new AdapterView.OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            switch (position) {
                case 0:
                    animationType.set(BaseQuickAdapter.SLIDEIN_BOTTOM);
                    break;
                case 1:
                    animationType.set(BaseQuickAdapter.ALPHAIN);
                    break;
                case 2:
                    animationType.set(BaseQuickAdapter.SCALEIN);
                    break;
                case 3:
                    animationType.set(BaseQuickAdapter.SLIDEIN_LEFT);
                    break;
                case 4:
                    animationType.set(BaseQuickAdapter.SLIDEIN_RIGHT);
                    break;
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    };
}

@Override
public RecyclerView.ItemDecoration onitemDecoration() {
    return new NormalLineDecoration(30, true);
}

Nos fijamos en el diseño del documento, hay una

aplicación: cs_brvah_animation = "@ {vm.animationType}", es establecer la animación viene brvah, cuando la dependencia es bueno, siempre y cuando la construcción se proporciona un método de modelo de vista, tales animationType.set (BaseQuickAdapter.SLIDEIN_BOTTOM); a esta llamada puede, si el diseño es demasiado dependiente de su animación por defecto es BaseQuickAdapter.SLIDEIN_BOTTOM.

Entonces RecyclerView, el adaptador Después de la unión, es la aplicación: cs_brvah_adapter = "@ {} vm.bindingAdapter", el modo de visualización predeterminada se establece RecyclerView LinearLayoutManager.

Cómo cargar animación personalizada y que GridLayoutManager

Mirada AnimationCustomActivity esta interfaz,

<data>

    <variable
        name="vm"
        type="com.caesar.brvahbinding.animation.AnimationCustomViewModel" />

    <import type="com.caesarlib.brvahbinding.CSBrvahLayoutManager" />
</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="@{vm.onBack}"
        android:text="返回" />

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:cs_brvah_Decoration="@{vm.itemDecoration}"
        app:cs_brvah_adapter="@{vm.bindingAdapter}"
        app:cs_brvah_animation_custom="@{vm.customAnimation}"
        app:cs_brvah_layoutManager="@{CSBrvahLayoutManager.grid(2)}" />
</LinearLayout>
    @Override
    protected Map<Integer, CSBravhItemBinding> getItemBinding() {
        Map<Integer, CSBravhItemBinding> mp = new HashMap<>();
        mp.put(0, new CSBravhItemBinding(com.caesar.brvahbinding.BR.bean, R.layout.item_simple));
        return mp;
    }

    @Override
    public void load() {
        load(CreateData.getSimpleData());

    @Override
    public RecyclerView.ItemDecoration onitemDecoration() {
        return new GridSpacingItemDecoration(2, 30, true);
    }

    @Override//设置自定义动画
    public BaseAnimation onCustomAnimation() {
        return new CustomAnimation();
    }

Se puede ver, el archivo de diseño, incluido con otras dos cosas, qué aplicación: cs_brvah_animation_custom = "@ {} vm.customAnimation" animación personalizada es vinculante, () Juego de devolución de llamada en el modelo de vista en onCustomAnimation, mi copia lado de las animaciones oficiales personalizados brvah. En el archivo de diseño, también se puede ver, introduje el <tipo de importación = "com.caesarlib.brvahbinding.CSBrvahLayoutManager" />, en RecyclerView, llamo, aplicación: cs_brvah_layoutManager = "@ {CSBrvahLayoutManager.grid (2)} "esta es la pantalla de la lista, se establece en 2 células GridLayoutManager, podemos ir a ver CSBrvahLayoutManager esta clase, que ha establecido varios métodos LayoutManager.

### con varios diseños, se dan cuenta MultipleItem

Mira MultipleLineActivity esta clase, la actividad también

Como se puede ver, el archivo de diseño es simple, la casa básica exactamente lo mismo, en MultiLineViewModel en la serie cuando baseviewmodel, para pasar genéricos MultiItemEntity, se puede ver, no es igual que otros básica de un cabello, y luego cada elemento de los datos son también muy simple.

En este momento, no habrá estudiantes preguntan: ah ah, antiguo matón honesto, ah, si quiero que mi punto de datos MultiItemEntity se da cuenta de cómo hacerlo? Por supuesto.

elemento no implementa varios diseños MultiItemEntity

@Override
public void load() {
    load(getData());
}

private Flowable<List<MultiItemEntity>> getData() {
    return Flowable.create(new FlowableOnSubscribe<List<MultiItemEntity>>() {
        @Override
        public void subscribe(FlowableEmitter<List<MultiItemEntity>> emitter) throws Exception {
            ArrayList<MultiItemEntity> data = new ArrayList<>();
            data.add(new MultiDataOne("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
            data.add(new MultiDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img0));
            data.add(new MultiDataTwo("这货是个标题", "这货是个内容加描述", R.mipmap.head_img2));
            data.add(new MultiDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
            data.add(new MultiDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
            data.add(new MultiDataOne("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
            data.add(new MultiDataTwo("这货是个标题", "这货是个内容加描述", R.mipmap.head_img2));
            data.add(new MultiDataOne("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
            data.add(new MultiDataOne("这货是个标题", "这货是个内容加描述", R.mipmap.head_img0));
            data.add(new MultiDataTwo("这货是个标题", "这货是个内容加描述", R.mipmap.head_img0));
            data.add(new MultiDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
            data.add(new MultiDataOne("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
            emitter.onNext(data);
            emitter.onComplete();
        }
    }, BackpressureStrategy.BUFFER);
}

@Override
public RecyclerView.ItemDecoration onitemDecoration() {
    return new NormalLineDecoration(30, true);
}
<data>

    <variable
        name="vm"
        type="com.caesar.brvahbinding.multiple.MultiLineViewModel" />

</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="@{vm.onBack}"
        android:text="返回" />

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:cs_brvah_Decoration="@{vm.itemDecoration}"
        app:cs_brvah_adapter="@{vm.bindingAdapter}"
        app:cs_brvah_animation="@{vm.animationType}" />
</LinearLayout>

</ Layout>
· · ·
Como se puede ver, el archivo de diseño es simple, la casa básica exactamente lo mismo, en MultiLineViewModel en la serie cuando baseviewmodel, pasan a los genéricos MultiItemEntity, se puede ver, no es con la otra moneda de diez centavos básica Al igual, entonces cada elemento de los datos es también muy simple.

En este momento, no habrá estudiantes preguntan: ah ah, antiguo matón honesto, ah, si quiero que mi punto de datos MultiItemEntity se da cuenta de cómo hacerlo? Por supuesto.

### artículo no implementa varios diseños MultiItemEntity

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="vm"
            type="com.caesar.brvahbinding.nonMultiple.NonMultiViewModel" />

        <import type="com.caesarlib.brvahbinding.CSBrvahLayoutManager" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".nonMultiple.NonMultipleActivity">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{vm.onBack}"
            android:text="返回" />

        <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="4dp"
            app:cs_brvah_Decoration="@{vm.itemDecoration}"
            app:cs_brvah_adapter="@{vm.bindingAdapter}"
            app:cs_brvah_layoutManager="@{CSBrvahLayoutManager.grid(4)}"
            app:cs_brvah_multiType="@{vm.multiTypeDelegat}"
            app:cs_brvah_spansize="@{vm.spanSizeLookup}" />
    </LinearLayout>
</layout>
public class NonMultiViewModel extends BaseBindingViewModel<customData> {
    //在构造方法中,设置SpanSizeLookup,这个是每个item占几格的回调.MultiTypeDelegat这个是itemType的回调判断了,如果不想继承MultiItemEntity的话
    //就要由该回调来判断
    public NonMultiViewModel() {
        super();
        setSpan(new BaseQuickAdapter.SpanSizeLookup() {
            @Override
            public int getSpanSize(GridLayoutManager gridLayoutManager, int i) {
                if (items.get(i).getItemType() == 0) {
                    return 1;
                } else if (items.get(i).getItemType() == 1) {
                    return 2;
                } else if (items.get(i).getItemType() == 2) {
                    return 4;
                } else {
                    return 0;
                }
            }
        });
        setMultiTypeDelegat(new MultiTypeDelegate<customData>() {
            @Override
            protected int getItemType(customData customData) {
                return customData.getItemType();
            }
        });
    }

    @Override//这里面还是跟其他的一样
    protected Map<Integer, CSBravhItemBinding> getItemBinding() {
        Map<Integer, CSBravhItemBinding> mp = new HashMap<>();
        mp.put(0, new CSBravhItemBinding(com.caesar.brvahbinding.BR.data, R.layout.item_nomulti_zero));
        mp.put(1, new CSBravhItemBinding(com.caesar.brvahbinding.BR.data, R.layout.item_nomulti_one));
        mp.put(2, new CSBravhItemBinding(com.caesar.brvahbinding.BR.data, R.layout.item_nomulti_two));
        //这边的0,1,2要跟上面setMultiTypeDelegat返回的要对应起来
        return mp;
    }

    @Override
    public void load() {
        load(getData());
    }

    private Flowable<List<customData>> getData() {
        return Flowable.create(new FlowableOnSubscribe<List<customData>>() {
            @Override
            public void subscribe(FlowableEmitter<List<customData>> emitter) throws Exception {
                ArrayList<customData> data = new ArrayList<>();
                data.add(new NeoDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataOne("这货是个标题", "这货是个内容加描述", R.mipmap.head_img0));
                data.add(new NeoDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataTwo("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img2));
                data.add(new NeoDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataOne("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataOne("这货是个标题", "这货是个内容加描述", R.mipmap.head_img0));
                data.add(new NeoDataOne("这货是个标题", "这货是个内容加描述", R.mipmap.head_img0));
                data.add(new NeoDataTwo("这货是个标题", "这货是个内容加描述", R.mipmap.head_img2));
                data.add(new NeoDataOne("这货是个标题", "这货是个内容加描述", R.mipmap.head_img0));
                data.add(new NeoDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataTwo("这货是个标题", "这货是个内容加描述", R.mipmap.head_img2));
                data.add(new NeoDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataTwo("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataZero("这货是个标题", "这货是个内容加描述", R.mipmap.head_img1));
                data.add(new NeoDataOne("这货是个标题", "这货是个内容加描述", R.mipmap.head_img0));
                emitter.onNext(data);
                emitter.onComplete();
            }
        }, BackpressureStrategy.BUFFER);
    }

    @Override
    public RecyclerView.ItemDecoration onitemDecoration() {
        return new NormaltemDecoration(10);
    }
}
public class customData {//可以是接口,可以是类,只要有type类型判断
    public int itemType;
    public String title;
    public String discribe;
    public int imgRes;

    public customData(String title, String discribe, int imgRes) {
        this.title = title;
        this.discribe = discribe;
        this.imgRes = imgRes;
    }

    public int getItemType() {
        return itemType;
    }

    public void setItemType(int itemType) {
        this.itemType = itemType;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDiscribe() {
        return discribe;
    }

    public void setDiscribe(String discribe) {
        this.discribe = discribe;
    }

    public int getImgRes() {
        return imgRes;
    }

    public void setImgRes(int imgRes) {
        this.imgRes = imgRes;
    }
}

Buscamos NonMultipleActivity esta clase, la interfaz es nada bueno que decir. CustomData esta clase, hay una la tipoElemento, de todos modos, siempre y cuando no se puede determinar un tipo de parámetros de los ítems puede ser, en el genérica NonMultiViewModel, la escritura CustomData. En el constructor, hay un método setSpan (), que es un adaptador para cada elemento representó varias de devolución de llamada, en circunstancias normales, multiforme diseño de cuadrícula, y la cuota de partida de diferentes formatos, básicamente, tienen el método de devolución de llamada, después de establecer el método, no se olvide que en el diseño, la

aplicación: cs_brvah_spansize = "@ {} vm.spanSizeLookup" vinculante. En el constructor, hay un método setMultiTypeDelegat, este método consiste en establecer el tipo de devolución de llamada de cada elemento, y luego en el archivo de diseño, por

aplicación: cs_brvah_multiType = "@ {} vm.multiTypeDelegat" vinculante, no es particularmente fácil.

El artículo no es fácil, si te gusto este artículo, o si tiene una gran cantidad de esperanza que nos ayuda, pulgar hacia arriba, hacia adelante, la preocupación oh. Los artículos serán actualizados continuamente. Absolutamente seco! ! !

Supongo que te gusta

Origin blog.51cto.com/14775360/2485827
Recomendado
Clasificación