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; 
 | 
        } 
 | 
    } 
 | 
} 
 |