package org.qii.weiciyuan.ui.basefragment;
import org.qii.weiciyuan.R;
import org.qii.weiciyuan.bean.UserListBean;
import org.qii.weiciyuan.bean.android.AsyncTaskLoaderResult;
import org.qii.weiciyuan.support.error.WeiboException;
import org.qii.weiciyuan.support.lib.pulltorefresh.PullToRefreshBase;
import org.qii.weiciyuan.support.lib.pulltorefresh.PullToRefreshListView;
import org.qii.weiciyuan.support.lib.pulltorefresh.extras.SoundPullEventListener;
import org.qii.weiciyuan.support.settinghelper.SettingUtility;
import org.qii.weiciyuan.support.utils.BundleArgsConstants;
import org.qii.weiciyuan.support.utils.GlobalContext;
import org.qii.weiciyuan.support.utils.Utility;
import org.qii.weiciyuan.ui.adapter.UserListAdapter;
import org.qii.weiciyuan.ui.interfaces.AbstractAppFragment;
import org.qii.weiciyuan.ui.loader.AbstractAsyncNetRequestTaskLoader;
import org.qii.weiciyuan.ui.loader.DummyLoader;
import org.qii.weiciyuan.ui.userinfo.UserInfoActivity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
/**
* User: qii
* Date: 12-8-18
*/
public abstract class AbstractUserListFragment extends AbstractAppFragment {
protected View footerView;
protected PullToRefreshListView pullToRefreshListView;
protected TextView empty;
protected ProgressBar progressBar;
private UserListAdapter userListAdapter;
protected UserListBean bean = new UserListBean();
protected static final int NEW_USER_LOADER_ID = 1;
protected static final int OLD_USER_LOADER_ID = 2;
private boolean canLoadOldData = true;
public ListView getListView() {
return pullToRefreshListView.getRefreshableView();
}
protected UserListAdapter getAdapter() {
return userListAdapter;
}
protected void clearAndReplaceValue(UserListBean value) {
bean.setNext_cursor(value.getNext_cursor());
bean.getUsers().clear();
bean.getUsers().addAll(value.getUsers());
bean.setTotal_number(value.getTotal_number());
bean.setPrevious_cursor(value.getPrevious_cursor());
}
protected ActionMode actionMode;
public void setmActionMode(ActionMode mActionMode) {
this.actionMode = mActionMode;
}
@Override
public void onResume() {
super.onResume();
getListView().setFastScrollEnabled(SettingUtility.allowFastScroll());
}
public AbstractUserListFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
setRetainInstance(false);
}
public UserListBean getList() {
return bean;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("bean", bean);
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.listview_layout, container, false);
empty = (TextView) view.findViewById(R.id.empty);
progressBar = (ProgressBar) view.findViewById(R.id.progressbar);
pullToRefreshListView = (PullToRefreshListView) view.findViewById(R.id.listView);
pullToRefreshListView.setOnRefreshListener(
new UserListOnRefreshListener());
pullToRefreshListView
.setOnLastItemVisibleListener(new UserListOnLastItemVisibleListener());
pullToRefreshListView.setOnPullEventListener(getPullEventListener());
pullToRefreshListView.setOnScrollListener(new UserListOnScrollListener());
pullToRefreshListView.setOnItemClickListener(new UserListOnItemClickListener());
pullToRefreshListView.getRefreshableView().setFooterDividersEnabled(false);
footerView = inflater.inflate(R.layout.listview_footer_layout, null);
getListView().addFooterView(footerView);
dismissFooterView();
userListAdapter = new UserListAdapter(AbstractUserListFragment.this, bean.getUsers(),
getListView());
pullToRefreshListView.setAdapter(userListAdapter);
return view;
}
private SoundPullEventListener<ListView> getPullEventListener() {
SoundPullEventListener<ListView> listener = new SoundPullEventListener<ListView>(
getActivity());
if (SettingUtility.getEnableSound()) {
listener.addSoundEvent(PullToRefreshBase.State.RELEASE_TO_REFRESH, R.raw.psst1);
// listener.addSoundEvent(PullToRefreshBase.State.GIVE_UP, R.raw.psst2);
listener.addSoundEvent(PullToRefreshBase.State.RESET, R.raw.pop);
}
return listener;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Loader<UserListBean> loader = getLoaderManager().getLoader(NEW_USER_LOADER_ID);
if (loader != null) {
getLoaderManager().initLoader(NEW_USER_LOADER_ID, null, userAsyncTaskLoaderCallback);
}
loader = getLoaderManager().getLoader(OLD_USER_LOADER_ID);
if (loader != null) {
getLoaderManager().initLoader(OLD_USER_LOADER_ID, null, userAsyncTaskLoaderCallback);
}
}
protected void listViewFooterViewClick(View view) {
loadOldMsg(view);
}
protected void listViewItemClick(AdapterView parent, View view, int position, long id) {
Intent intent = new Intent(getActivity(), UserInfoActivity.class);
intent.putExtra("token", GlobalContext.getInstance().getSpecialToken());
intent.putExtra("user", bean.getUsers().get(position));
startActivity(intent);
}
protected void refreshLayout(UserListBean bean) {
if (bean.getUsers().size() > 0) {
empty.setVisibility(View.INVISIBLE);
progressBar.setVisibility(View.INVISIBLE);
// listView.setVisibility(View.VISIBLE);
} else {
empty.setVisibility(View.INVISIBLE);
progressBar.setVisibility(View.INVISIBLE);
// listView.setVisibility(View.INVISIBLE);
}
}
protected void showFooterView() {
View view = footerView.findViewById(R.id.loading_progressbar);
view.setVisibility(View.VISIBLE);
view.setScaleX(1.0f);
view.setScaleY(1.0f);
view.setAlpha(1.0f);
footerView.findViewById(R.id.laod_failed).setVisibility(View.GONE);
}
protected void dismissFooterView() {
final View progressbar = footerView.findViewById(R.id.loading_progressbar);
progressbar.animate().scaleX(0).scaleY(0).alpha(0.5f).setDuration(300)
.withEndAction(new Runnable() {
@Override
public void run() {
progressbar.setVisibility(View.GONE);
}
});
footerView.findViewById(R.id.laod_failed).setVisibility(View.GONE);
}
protected void showErrorFooterView() {
View view = footerView.findViewById(R.id.loading_progressbar);
view.setVisibility(View.GONE);
TextView tv = ((TextView) footerView.findViewById(R.id.laod_failed));
tv.setVisibility(View.VISIBLE);
}
public void loadNewMsg() {
canLoadOldData = true;
getLoaderManager().destroyLoader(OLD_USER_LOADER_ID);
dismissFooterView();
getLoaderManager().restartLoader(NEW_USER_LOADER_ID, null, userAsyncTaskLoaderCallback);
}
protected void loadOldMsg(View view) {
if (getLoaderManager().getLoader(OLD_USER_LOADER_ID) != null || !canLoadOldData) {
return;
}
getLoaderManager().destroyLoader(NEW_USER_LOADER_ID);
getPullToRefreshListView().onRefreshComplete();
getLoaderManager().restartLoader(OLD_USER_LOADER_ID, null, userAsyncTaskLoaderCallback);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.actionbar_menu_userlistfragment, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.loading_progressbar:
pullToRefreshListView.setRefreshing();
loadNewMsg();
break;
}
return super.onOptionsItemSelected(item);
}
private void showListView() {
empty.setVisibility(View.INVISIBLE);
// listView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.INVISIBLE);
}
private PullToRefreshListView getPullToRefreshListView() {
return this.pullToRefreshListView;
}
public void clearActionMode() {
if (actionMode != null) {
actionMode.finish();
actionMode = null;
}
if (pullToRefreshListView != null && getListView().getCheckedItemCount() > 0) {
getListView().clearChoices();
if (getAdapter() != null) {
getAdapter().notifyDataSetChanged();
}
}
}
private class UserListOnLastItemVisibleListener
implements PullToRefreshBase.OnLastItemVisibleListener {
@Override
public void onLastItemVisible() {
listViewFooterViewClick(null);
}
}
private class UserListOnRefreshListener
implements PullToRefreshBase.OnRefreshListener<ListView> {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
loadNewMsg();
}
}
private class UserListOnItemClickListener implements AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (actionMode != null) {
getListView().clearChoices();
actionMode.finish();
actionMode = null;
return;
}
getListView().clearChoices();
if (position - 1 < getList().getUsers().size()) {
listViewItemClick(parent, view, position - 1, id);
} else {
listViewFooterViewClick(view);
}
}
}
private class UserListOnScrollListener implements AbsListView.OnScrollListener {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
if (getListView().getLastVisiblePosition() > 7
&& getListView().getLastVisiblePosition() > getList().getUsers().size() - 3
&& getListView().getFirstVisiblePosition() != getListView()
.getHeaderViewsCount()) {
loadOldMsg(null);
}
}
}
protected abstract void oldUserLoaderSuccessCallback(UserListBean newValue);
protected void newUserLoaderSuccessCallback() {
}
private Loader<AsyncTaskLoaderResult<UserListBean>> createNewUserLoader(int id, Bundle args) {
Loader<AsyncTaskLoaderResult<UserListBean>> loader = onCreateNewUserLoader(id, args);
if (loader == null) {
loader = new DummyLoader<UserListBean>(getActivity());
}
if (loader instanceof AbstractAsyncNetRequestTaskLoader) {
((AbstractAsyncNetRequestTaskLoader) loader).setArgs(args);
}
return loader;
}
private Loader<AsyncTaskLoaderResult<UserListBean>> createOldUserLoader(int id, Bundle args) {
Loader<AsyncTaskLoaderResult<UserListBean>> loader = onCreateOldUserLoader(id, args);
if (loader == null) {
loader = new DummyLoader<UserListBean>(getActivity());
}
return loader;
}
protected Loader<AsyncTaskLoaderResult<UserListBean>> onCreateNewUserLoader(int id,
Bundle args) {
return null;
}
protected Loader<AsyncTaskLoaderResult<UserListBean>> onCreateOldUserLoader(int id,
Bundle args) {
return null;
}
protected LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<UserListBean>>
userAsyncTaskLoaderCallback
= new LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<UserListBean>>() {
@Override
public Loader<AsyncTaskLoaderResult<UserListBean>> onCreateLoader(int id, Bundle args) {
// clearActionMode();
showListView();
switch (id) {
case NEW_USER_LOADER_ID:
if (args == null || args.getBoolean(BundleArgsConstants.SCROLL_TO_TOP)) {
Utility.stopListViewScrollingAndScrollToTop(getListView());
}
return createNewUserLoader(id, args);
case OLD_USER_LOADER_ID:
showFooterView();
return createOldUserLoader(id, args);
}
return null;
}
@Override
public void onLoadFinished(Loader<AsyncTaskLoaderResult<UserListBean>> loader,
AsyncTaskLoaderResult<UserListBean> result) {
UserListBean data = result != null ? result.data : null;
WeiboException exception = result != null ? result.exception : null;
switch (loader.getId()) {
case NEW_USER_LOADER_ID:
getPullToRefreshListView().onRefreshComplete();
refreshLayout(getList());
if (Utility.isAllNotNull(exception)) {
Toast.makeText(getActivity(), exception.getError(), Toast.LENGTH_SHORT)
.show();
} else {
if (data != null && data.getUsers().size() > 0) {
clearAndReplaceValue(data);
getAdapter().notifyDataSetChanged();
getListView().setSelectionAfterHeaderView();
newUserLoaderSuccessCallback();
}
}
break;
case OLD_USER_LOADER_ID:
refreshLayout(getList());
if (exception != null) {
showErrorFooterView();
} else if (data != null) {
canLoadOldData = data.getUsers().size() > 1;
oldUserLoaderSuccessCallback(data);
getAdapter().notifyDataSetChanged();
dismissFooterView();
} else {
canLoadOldData = false;
dismissFooterView();
}
break;
}
getLoaderManager().destroyLoader(loader.getId());
}
@Override
public void onLoaderReset(Loader<AsyncTaskLoaderResult<UserListBean>> loader) {
}
};
}