1.以下代码是在Fragment加载,修改为Activity加载很简单:public class MyFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener,
RequestHistoryUtils.OnRequestCallback {
public static final int MODE_LOAD = 0;
public static final int MODE_LOAD_MORE = 1;
public static final int MODE_LOAD_PULL_REFRESH = 2;
private static final int VIEW_TYPE_ITEM = 0;
private static final int VIEW_TYPE_PANEL = 1;
private static final int VIEW_TYPE_FOOTER = 2;
private MyApplication _app = null;
private int _panelPosition = -1;
private SwipeRefreshLayout _srRefresh = null;
private RecyclerView _listView = null;
private List _data = null;
private MyAdapter _adapter = null;
private int _currentMode = 0;
private RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int lastVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()) .findLastCompletelyVisibleItemPosition();
if (lastVisibleItem == _data.size() && _data.size() > 0 && dy > 0 && _adapter.isCanLoadMore()) {
requestHttp(MODE_LOAD_MORE);
} else {
_srRefresh.setRefreshing(false);
}
}
};
/**
* Pull down to load the latest first page data
* For search result
* For common history
*/
@Override
public void onRefresh() {
requestHttp(MODE_LOAD_PULL_REFRESH);
}
public static MyFragment newInstance() {
return new MyFragment();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_app = ((MyApplication) getActivity().getApplicationContext());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout., container, false);
_srRefresh = rootView.findViewById(R.id.sr_refresh);
_srRefresh.setColorSchemeResources(R.color.color_btn_login_normal);
_srRefresh.setProgressBackgroundColorSchemeResource(R.color.color_item_line);
_data = new ArrayList<>();
_listView = rootView.findViewById(R.id.listView);
_listView.setLayoutManager(new LinearLayoutManager(getActivity()));
_adapter = new MyAdapter(getActivity());
_listView.setAdapter(_adapter);
_listView.setHasFixedSize(true);
_listView.setItemAnimator(new DefaultItemAnimator());
_srRefresh.setOnRefreshListener(this);
_listView.postDelayed(new Runnable() {
@Override
public void run() {
requestHttp(MODE_LOAD);
}
}, DELAY_LOAD_TIME);
_listView.addOnScrollListener(onScrollListener);
return rootView;
}
protected void insertItemByPosition(int position) {
RemoveItemByIsPanel();
if (_panelPosition != -1 && _panelPosition
position = position - 1;
}
if (_panelPosition != position) {
_panelPosition = position;
if (_adapter != null && position > 0) {
_adapter.notifyItemInserted(position);
BeanData data = new BeanData();
data.setIsPanel(true);
_data.add(position, event);
_adapter.notifyItemRangeChanged(position, _adapter.getItemCount());
}
_listView.smoothScrollToPosition(position);
} else {
_panelPosition = -1;
}
_adapter.notifyItemRangeChanged(0, _adapter.getItemCount());
}
protected void RemoveItemByIsPanel() {
for (int i = 0; i
if (_data.get(i).isPanel()) {
_adapter.notifyItemRemoved(i);
_data.remove(i);
_adapter.notifyItemRangeChanged(i, _adapter.getItemCount());
}
}
}
private class MyAdapter extends RecyclerView.Adapter {
private LayoutInflater listContainer;
private boolean isCanLoadMore = false;
MyAdapter(Context context) {
listContainer = LayoutInflater.from(context);
}
private boolean isCanLoadMore() {
return isCanLoadMore;
}
private void setIsCanLoadMore(Boolean isCanLoadMore) {
this.isCanLoadMore = isCanLoadMore;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
if (viewType == VIEW_TYPE_ITEM) {
View view = listContainer.inflate(R.layout.layout_list_item_content, viewGroup, false);
return new ItemViewHolder(view);
} else if (viewType == VIEW_TYPE_PANEL) {
View view = listContainer.inflate(R.layout.layout_list_item_panel, viewGroup, false);
return new PanelViewHolder(view);
} else if (viewType == VIEW_TYPE_FOOTER) {
View view = listContainer.inflate(R.layout.layout_list_item_load_more_footer, viewGroup, false);
return new FooterViewHolder(view);
}
return null;
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int position) {
if (viewHolder instanceof PanelViewHolder) {
//TODO setup data or event for UI
} else if (viewHolder instanceof ItemViewHolder) {
((ItemViewHolder) viewHolder).rl_content.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
insertItemByPosition(viewHolder.getAdapterPosition() + 1);
}
});
//TODO setup data or event for UI
}
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemCount() {
if (_data.size() > 0 && isCanLoadMore()) {
return _data.size() + 1;
} else {
return _data.size();
}
}
@Override
public int getItemViewType(int position) {
if (position == _data.size()) {
return VIEW_TYPE_FOOTER;
} else if (_data.get(position).isPanel()) {
return VIEW_TYPE_PANEL;
} else {
return VIEW_TYPE_ITEM;
}
}
class ItemViewHolder extends RecyclerView.ViewHolder {
View rl_content;
ItemViewHolder(View itemView) {
super(itemView);
rl_content = itemView.findViewById(R.id.rl_content);
}
}
class PanelViewHolder extends RecyclerView.ViewHolder {
PanelViewHolder(View itemView) {
super(itemView);
}
}
class FooterViewHolder extends RecyclerView.ViewHolder {
FooterViewHolder(View itemView) {
super(itemView);
}
}
}
private void requestHttp(int mode) {
_currentMode = mode;
_requestCode++;
RequestHistoryUtils requestHistoryUtils = new RequestHistoryUtils(_requestCode, this);
requestHistoryUtils.loadData(mode, _data.get(data.size()-1).getIndex()+"");
}
@Override
public void onRequestWillStart(int mode, int requestCode) {
if (mode == MODE_LOAD) {
_app.showProgressDialog(getActivity());
}
}
@Override
public void onRequestSuccess(int mode, int requestCode, List e) {
if (_requestCode != requestCode) {// This request was canceled by user's pressing back
if (_currentMode == MODE_LOAD_PULL_REFRESH) {//canceled request may be open a progress bar, so need close
_app.dismissProgressDialog();
} else {//canceled request may be by pull down, so need close
_srRefresh.setRefreshing(false);
}
return;
}
if (mode == MODE_LOAD) {
_app.dismissProgressDialog();
}
if (getActivity() == null) {
return;
}
if (e == null) {
_app.ToastMessage(getActivity(), R.string.http_error_return_null);
return;
}
if (mode == MODE_LOAD || mode == MODE_LOAD_PULL_REFRESH) {
if (mode == MODE_LOAD_PULL_REFRESH) {
_srRefresh.setRefreshing(false);
}
_data.clear();
_data.addAll(e);
_panelPosition = -1;
if (_data.size() > 0 && _data.size() % RequestHistoryUtils.PAGE_SIZE == 0) {
_adapter.setIsCanLoadMore(true);
} else {
_adapter.setIsCanLoadMore(false);
}
_adapter.notifyDataSetChanged();
_listView.scrollToPosition(0);
} else if (mode == MODE_LOAD_MORE) {
_data.addAll(e);
_panelPosition = -1;
if (_data.size() > 0 && _data.size() % RequestHistoryUtils.PAGE_SIZE == 0) {
_adapter.setIsCanLoadMore(true);
} else {
_adapter.setIsCanLoadMore(false);
}
_adapter.notifyDataSetChanged();
}
if (e.isEmpty()) {
_app.ToastMessage(getActivity(), R.string.load_data_empty);
}
}
@Override
public void onRequestFailed(int mode, int requestCode, int errMsg) {
if (_requestCode != requestCode) {// This request was canceled by user's pressing back
if (_currentMode == MODE_LOAD_PULL_REFRESH) {//canceled request may be open a progress bar, so need close
_app.dismissProgressDialog();
} else {//canceled request may be by pull down, so need close
_srRefresh.setRefreshing(false);
}
return;
}
if (mode == MODE_LOAD) {
_app.dismissProgressDialog();
}
if (getActivity() == null) {
return;
}
if (mode == MODE_LOAD_PULL_REFRESH) {
_srRefresh.setRefreshing(false);
}
if (errMsg == R.string.http_error_from_service) {
_app.ToastMessage(getActivity(), FaceDetectionApp.error_message);
} else {
_app.ToastMessage(getActivity(), errMsg);
}
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden) {
_listView.addOnScrollListener(onScrollListener);
_listView.postDelayed(new Runnable() {
@Override
public void run() {
requestHttp(MODE_LOAD);
}
}, DELAY_LOAD_TIME);
} else {
_listView.removeOnScrollListener(onScrollListener);
}
}
}
2.其他代码:public class RequestHistoryUtils {
public static final int PAGE_SIZE = 20;
private int requestCode = 0;
private OnRequestCallback onRequestCallback = null;
public RequestHistoryUtils(int requestCode, OnRequestCallback onRequestCallback) {
this.requestCode = requestCode;// Used to check cancel status
this.onRequestCallback = onRequestCallback;
}
public interface OnRequestCallback {
void onRequestWillStart(int mode, int requestCode);
void onRequestSuccess(int mode, int requestCode, List alarmList);
void onRequestFailed(int mode, int requestCode, int errMsg);
}
public void setRequestCode(int requestCode) {
this.requestCode = requestCode;
}
public void loadData(final int mode, String alarmIndex) {
TaskHistory task = new TaskHistory(new AsyncTaskDelegate>() {
@Override
public void willStart(AsyncTask, ?, ?> asyncTask) {
onRequestCallback.onRequestWillStart(mode, requestCode);
}
@Override
public void onSuccess(AsyncTask, ?, ?> asyncTask, List e) {
onRequestCallback.onRequestSuccess(mode, requestCode, e);
onRequestCallback = null;
}
@Override
public void onFailed(AsyncTask, ?, ?> asyncTask, Throwable t, int errMsg) {
onRequestCallback.onRequestFailed(mode, requestCode, errMsg);
onRequestCallback = null;
}
@Override
public void onTokenOutOfDate() {
}
});
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, alarmIndex, PAGE_SIZE + "");
}
}
3. 布局代码:<?xml version="1.0" encoding="utf-8"?>
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#999999"
android:orientation="vertical">
android:id="@+id/sr_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="#00000000"
android:divider="@null"
android:dividerHeight="0dp"
android:fadeScrollbars="false"
android:listSelector="#00000000"
android:scrollbars="vertical"/>
4.List item 略.
以上代码,记录在这里, 留作以后。