## Tutorial How To Use FrogoRecyclerView Multi View Holder This is the procedure for using frogo-recycler-view multi type view ## Screen Shoot Apps | Main | Multi View | Empty View | |:------------------:|:---------------------:|:-----------------:| | | | | ## Usage (How to use this project) Just following the step until finish ### Step 1. Create xml view ### Step 2. Setup requirement (Multi Adapter) #### List Value Option const val OPTION_HOLDER_FIRST = 0 const val OPTION_HOLDER_SECOND = 1 #### Kotlin (using injector singleton, with 2 custom view holder) private fun firstCallback(): IFrogoViewHolder { return object : IFrogoViewHolder { override fun setupInitComponent(view: View, data: ExampleModel) { // Init component content item recyclerview view.findViewById(R.id.frogo_rv_grid_type_1_tv_title).text = data.name Glide.with(view.context).load(FrogoRvConstant.LINK_PHOTO_GITHUB).into(view.findViewById(R.id.frogo_rv_grid_type_1_iv_poster)) } } } private fun secondCallback(): IFrogoViewHolder { return object : IFrogoViewHolder{ override fun setupInitComponent(view: View, data: ExampleModel) { // Init component content item recyclerview view.findViewById(R.id.frogo_rv_grid_type_3_tv_title).text = data.name view.findViewById(R.id.frogo_rv_grid_type_3_tv_subtitle).text = data.name view.findViewById(R.id.frogo_rv_grid_type_3_tv_desc).text = FrogoRvConstant.DUMMY_LOREM_IPSUM Glide.with(view.context).load(FrogoRvConstant.LINK_PHOTO_GITHUB).into(view.findViewById(R.id.frogo_rv_grid_type_3_iv_poster)) } } } private fun firstListenerType(): FrogoRecyclerViewListener{ return object : FrogoRecyclerViewListener{ override fun onItemClicked(data: ExampleModel) { showToast(data.name + " First") } override fun onItemLongClicked(data: ExampleModel) { showToast("LAYOUT TYPE 1") } } } private fun secondListenerType() : FrogoRecyclerViewListener{ return object : FrogoRecyclerViewListener{ override fun onItemClicked(data: ExampleModel) { showToast(data.name + " Second") } override fun onItemLongClicked(data: ExampleModel) { showToast("LAYOUT TYPE 2") } } } private fun data() : MutableList> { val data = mutableListOf>() data.add(FrogoHolder(ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_1, FrogoRvConstant.OPTION_HOLDER_FIRST, firstCallback(), firstListenerType())) data.add(FrogoHolder(ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_3, FrogoRvConstant.OPTION_HOLDER_SECOND, secondCallback(), secondListenerType())) data.add(FrogoHolder(ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_3, FrogoRvConstant.OPTION_HOLDER_SECOND, secondCallback(), secondListenerType())) data.add(FrogoHolder(ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_3, FrogoRvConstant.OPTION_HOLDER_SECOND, secondCallback(), secondListenerType())) data.add(FrogoHolder(ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_3, FrogoRvConstant.OPTION_HOLDER_SECOND, secondCallback(), secondListenerType())) data.add(FrogoHolder(ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_1, FrogoRvConstant.OPTION_HOLDER_FIRST, firstCallback(), firstListenerType())) data.add(FrogoHolder(ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_1, FrogoRvConstant.OPTION_HOLDER_FIRST, firstCallback(), firstListenerType())) data.add(FrogoHolder(ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_3, FrogoRvConstant.OPTION_HOLDER_SECOND, secondCallback(), secondListenerType())) data.add(FrogoHolder(ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_3, FrogoRvConstant.OPTION_HOLDER_SECOND, secondCallback(), secondListenerType())) data.add(FrogoHolder(ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_1, FrogoRvConstant.OPTION_HOLDER_FIRST, firstCallback(), firstListenerType())) return data } private fun setupFrogoRecyclerView() { binding.frogoRecyclerView .injector() .addDataFH(data()) .createLayoutStaggeredGrid(2) .build() } #### Java (sample using ViewBinding) private static IFrogoViewHolder firstCallback() { return (view, data) -> { // Init component content item recyclerview TextView title = view.findViewById(R.id.frogo_rv_grid_type_1_tv_title); ImageView photo = view.findViewById(R.id.frogo_rv_grid_type_1_iv_poster); title.setText(data.getName()); Glide.with(view.getContext()).load(FrogoRvConstant.LINK_PHOTO_GITHUB).into(photo); }; } private static IFrogoViewHolder secondCallback() { return (view, data) -> { // Init component content item recyclerview TextView title = view.findViewById(R.id.frogo_rv_grid_type_3_tv_title); TextView subTitle = view.findViewById(R.id.frogo_rv_grid_type_3_tv_subtitle); TextView desc = view.findViewById(R.id.frogo_rv_grid_type_3_tv_desc); ImageView photo = view.findViewById(R.id.frogo_rv_grid_type_3_iv_poster); title.setText(data.getName()); subTitle.setText(data.getName()); desc.setText(FrogoRvConstant.DUMMY_LOREM_IPSUM); Glide.with(view.getContext()).load(FrogoRvConstant.LINK_PHOTO_GITHUB).into(photo); }; } private FrogoRecyclerViewListener firstListenerType() { return new FrogoRecyclerViewListener() { @Override public void onItemLongClicked(ExampleModel data) { showToast(data.getName() + " First"); } @Override public void onItemClicked(ExampleModel data) { showToast("LAYOUT TYPE 1"); } }; } private FrogoRecyclerViewListener secondListenerType() { return new FrogoRecyclerViewListener() { @Override public void onItemLongClicked(ExampleModel data) { showToast(data.getName() + " Second"); } @Override public void onItemClicked(ExampleModel data) { showToast("LAYOUT TYPE 2"); } }; } private ArrayList> data() { ArrayList> data = new ArrayList<>(); data.add(new FrogoHolder(new ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_1, FrogoRvConstant.OPTION_HOLDER_FIRST, firstCallback(), firstListenerType())); data.add(new FrogoHolder(new ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_3, FrogoRvConstant.OPTION_HOLDER_SECOND, secondCallback(), secondListenerType())); data.add(new FrogoHolder(new ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_3, FrogoRvConstant.OPTION_HOLDER_SECOND, secondCallback(), secondListenerType())); data.add(new FrogoHolder(new ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_3, FrogoRvConstant.OPTION_HOLDER_SECOND, secondCallback(), secondListenerType())); data.add(new FrogoHolder(new ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_3, FrogoRvConstant.OPTION_HOLDER_SECOND, secondCallback(), secondListenerType())); data.add(new FrogoHolder(new ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_1, FrogoRvConstant.OPTION_HOLDER_FIRST, firstCallback(), firstListenerType())); data.add(new FrogoHolder(new ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_1, FrogoRvConstant.OPTION_HOLDER_FIRST, firstCallback(), firstListenerType())); data.add(new FrogoHolder(new ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_3, FrogoRvConstant.OPTION_HOLDER_SECOND, secondCallback(), secondListenerType())); data.add(new FrogoHolder(new ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_3, FrogoRvConstant.OPTION_HOLDER_SECOND, secondCallback(), secondListenerType())); data.add(new FrogoHolder(new ExampleModel(Constant.FULL_NAME), R.layout.frogo_rv_grid_type_1, FrogoRvConstant.OPTION_HOLDER_FIRST, firstCallback(), firstListenerType())); return data; } private void setupFrogoRecyclerView() { binding.frogoRecyclerView.injector() .addDataFH(data()) .createLayoutStaggeredGrid(2) .build(); } ## Sample Code (Multi-type-view) - Kotlin - [KotlinNoAdapterMultiVewActivity.kt](https://github.com/amirisback/frogo-recycler-view/blob/master/app/src/main/java/com/frogobox/recycler/sample/kotlin/noadapter/KotlinNoAdapterMultiVewActivity.kt) - Java - [JavaNoAdapterMultiViewActivity.java](https://github.com/amirisback/frogo-recycler-view/blob/master/app/src/main/java/com/frogobox/recycler/sample/java/noadapter/JavaNoAdapterMultiViewActivity.java)