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