| package com.doumee.lib_coremodel.binding.viewadapter.recyclerview; | 
|   | 
|   | 
| import androidx.databinding.BindingAdapter; | 
| import androidx.recyclerview.widget.LinearLayoutManager; | 
| import androidx.recyclerview.widget.RecyclerView; | 
|   | 
| import com.doumee.lib_coremodel.binding.command.BindingCommand; | 
|   | 
| import java.util.concurrent.TimeUnit; | 
|   | 
| import io.reactivex.functions.Consumer; | 
| import io.reactivex.subjects.PublishSubject; | 
|   | 
|   | 
| /** | 
|  * Created by goldze on 2017/6/16. | 
|  */ | 
| public class ViewAdapter { | 
|   | 
|     @BindingAdapter("lineManager") | 
|     public static void setLineManager(RecyclerView recyclerView, LineManagers.LineManagerFactory lineManagerFactory) { | 
|         recyclerView.addItemDecoration(lineManagerFactory.create(recyclerView)); | 
|     } | 
|   | 
|   | 
|     @BindingAdapter(value = {"onScrollChangeCommand", "onScrollStateChangedCommand"}, requireAll = false) | 
|     public static void onScrollChangeCommand(final RecyclerView recyclerView, | 
|                                              final BindingCommand<ScrollDataWrapper> onScrollChangeCommand, | 
|                                              final BindingCommand<Integer> onScrollStateChangedCommand) { | 
|         recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { | 
|             private int state; | 
|   | 
|             @Override | 
|             public void onScrolled(RecyclerView recyclerView, int dx, int dy) { | 
|                 super.onScrolled(recyclerView, dx, dy); | 
|                 if (onScrollChangeCommand != null) { | 
|                     onScrollChangeCommand.execute(new ScrollDataWrapper(dx, dy, state)); | 
|                 } | 
|             } | 
|   | 
|             @Override | 
|             public void onScrollStateChanged(RecyclerView recyclerView, int newState) { | 
|                 super.onScrollStateChanged(recyclerView, newState); | 
|                 state = newState; | 
|                 if (onScrollStateChangedCommand != null) { | 
|                     onScrollStateChangedCommand.execute(newState); | 
|                 } | 
|             } | 
|         }); | 
|   | 
|     } | 
|   | 
|     @SuppressWarnings("unchecked") | 
|     @BindingAdapter({"onLoadMoreCommand"}) | 
|     public static void onLoadMoreCommand(final RecyclerView recyclerView, final BindingCommand<Integer> onLoadMoreCommand) { | 
|         RecyclerView.OnScrollListener listener = new OnScrollListener(onLoadMoreCommand); | 
|         recyclerView.addOnScrollListener(listener); | 
|   | 
|     } | 
|   | 
|     @BindingAdapter("itemAnimator") | 
|     public static void setItemAnimator(RecyclerView recyclerView, RecyclerView.ItemAnimator animator) { | 
|         recyclerView.setItemAnimator(animator); | 
|     } | 
|   | 
|     public static class OnScrollListener extends RecyclerView.OnScrollListener { | 
|   | 
|         private PublishSubject<Integer> methodInvoke = PublishSubject.create(); | 
|   | 
|         private BindingCommand<Integer> onLoadMoreCommand; | 
|   | 
|         public OnScrollListener(final BindingCommand<Integer> onLoadMoreCommand) { | 
|             this.onLoadMoreCommand = onLoadMoreCommand; | 
|             methodInvoke.throttleFirst(1, TimeUnit.SECONDS) | 
|                     .subscribe(new Consumer<Integer>() { | 
|                         @Override | 
|                         public void accept(Integer integer) throws Exception { | 
|                             onLoadMoreCommand.execute(integer); | 
|                         } | 
|                     }); | 
|         } | 
|   | 
|         @Override | 
|         public void onScrolled(RecyclerView recyclerView, int dx, int dy) { | 
|             LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); | 
|             int visibleItemCount = layoutManager.getChildCount(); | 
|             int totalItemCount = layoutManager.getItemCount(); | 
|             int pastVisiblesItems = layoutManager.findFirstVisibleItemPosition(); | 
|             if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) { | 
|                 if (onLoadMoreCommand != null) { | 
|                     methodInvoke.onNext(recyclerView.getAdapter().getItemCount()); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         @Override | 
|         public void onScrollStateChanged(RecyclerView recyclerView, int newState) { | 
|             super.onScrollStateChanged(recyclerView, newState); | 
|         } | 
|   | 
|   | 
|     } | 
|   | 
|     public static class ScrollDataWrapper { | 
|         public float scrollX; | 
|         public float scrollY; | 
|         public int state; | 
|   | 
|         public ScrollDataWrapper(float scrollX, float scrollY, int state) { | 
|             this.scrollX = scrollX; | 
|             this.scrollY = scrollY; | 
|             this.state = state; | 
|         } | 
|     } | 
| } |