package com.doumee.lib_coremodel.binding.viewadapter.listview; 
 | 
  
 | 
  
 | 
import android.view.View; 
 | 
import android.widget.AbsListView; 
 | 
import android.widget.AdapterView; 
 | 
import android.widget.ListView; 
 | 
  
 | 
import androidx.databinding.BindingAdapter; 
 | 
  
 | 
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/18. 
 | 
 */ 
 | 
public final class ViewAdapter { 
 | 
  
 | 
    @SuppressWarnings("unchecked") 
 | 
    @BindingAdapter(value = {"onScrollChangeCommand", "onScrollStateChangedCommand"}, requireAll = false) 
 | 
    public static void onScrollChangeCommand(final ListView listView, 
 | 
                                             final BindingCommand<ListViewScrollDataWrapper> onScrollChangeCommand, 
 | 
                                             final BindingCommand<Integer> onScrollStateChangedCommand) { 
 | 
        listView.setOnScrollListener(new AbsListView.OnScrollListener() { 
 | 
            private int scrollState; 
 | 
  
 | 
            @Override 
 | 
            public void onScrollStateChanged(AbsListView view, int scrollState) { 
 | 
                this.scrollState = scrollState; 
 | 
                if (onScrollStateChangedCommand != null) { 
 | 
                    onScrollStateChangedCommand.execute(scrollState); 
 | 
                } 
 | 
            } 
 | 
  
 | 
            @Override 
 | 
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
 | 
                if (onScrollChangeCommand != null) { 
 | 
                    onScrollChangeCommand.execute(new ListViewScrollDataWrapper(scrollState, firstVisibleItem, visibleItemCount, totalItemCount)); 
 | 
                } 
 | 
            } 
 | 
        }); 
 | 
  
 | 
    } 
 | 
  
 | 
  
 | 
    @BindingAdapter(value = {"onItemClickCommand"}, requireAll = false) 
 | 
    public static void onItemClickCommand(final ListView listView, final BindingCommand<Integer> onItemClickCommand) { 
 | 
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
 | 
            @Override 
 | 
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
 | 
                if (onItemClickCommand != null) { 
 | 
                    onItemClickCommand.execute(position); 
 | 
                } 
 | 
            } 
 | 
        }); 
 | 
    } 
 | 
  
 | 
  
 | 
    @BindingAdapter({"onLoadMoreCommand"}) 
 | 
    public static void onLoadMoreCommand(final ListView listView, final BindingCommand<Integer> onLoadMoreCommand) { 
 | 
        listView.setOnScrollListener(new OnScrollListener(listView, onLoadMoreCommand)); 
 | 
  
 | 
    } 
 | 
  
 | 
    public static class OnScrollListener implements AbsListView.OnScrollListener { 
 | 
        private PublishSubject<Integer> methodInvoke = PublishSubject.create(); 
 | 
        private BindingCommand<Integer> onLoadMoreCommand; 
 | 
        private ListView listView; 
 | 
  
 | 
        public OnScrollListener(ListView listView, final BindingCommand<Integer> onLoadMoreCommand) { 
 | 
            this.onLoadMoreCommand = onLoadMoreCommand; 
 | 
            this.listView = listView; 
 | 
            methodInvoke.throttleFirst(1, TimeUnit.SECONDS) 
 | 
                    .subscribe(new Consumer<Integer>() { 
 | 
                        @Override 
 | 
                        public void accept(Integer integer) throws Exception { 
 | 
                            onLoadMoreCommand.execute(integer); 
 | 
                        } 
 | 
                    }); 
 | 
        } 
 | 
  
 | 
        @Override 
 | 
        public void onScrollStateChanged(AbsListView view, int scrollState) { 
 | 
  
 | 
        } 
 | 
  
 | 
        @Override 
 | 
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
 | 
            if (firstVisibleItem + visibleItemCount >= totalItemCount 
 | 
                    && totalItemCount != 0 
 | 
                    && totalItemCount != listView.getHeaderViewsCount() 
 | 
                    + listView.getFooterViewsCount()) { 
 | 
                if (onLoadMoreCommand != null) { 
 | 
                    methodInvoke.onNext(totalItemCount); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public static class ListViewScrollDataWrapper { 
 | 
        public int firstVisibleItem; 
 | 
        public int visibleItemCount; 
 | 
        public int totalItemCount; 
 | 
        public int scrollState; 
 | 
  
 | 
        public ListViewScrollDataWrapper(int scrollState, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
 | 
            this.firstVisibleItem = firstVisibleItem; 
 | 
            this.visibleItemCount = visibleItemCount; 
 | 
            this.totalItemCount = totalItemCount; 
 | 
            this.scrollState = scrollState; 
 | 
        } 
 | 
    } 
 | 
} 
 |