package net.coding.program.project.git; import android.view.View; import android.widget.AbsListView; import net.coding.program.FootUpdate; import net.coding.program.R; import net.coding.program.common.ClickSmallImage; import net.coding.program.common.MyImageGetter; import net.coding.program.common.comment.BaseCommentParam; import net.coding.program.common.widget.RefreshBaseActivity; import net.coding.program.model.Commit; import net.coding.program.project.detail.merge.CommitFileListActivity_; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.Extra; import org.androidannotations.annotations.ViewById; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import se.emilsjolander.stickylistheaders.ExpandableStickyListHeadersListView; @EActivity(R.layout.fragment_project_dynamic) public class BranchCommitListActivity extends RefreshBaseActivity implements FootUpdate.LoadMore { private static final String HOST_COMMITS_PAGER = "HOST_COMMITS_PAGER"; @ViewById protected ExpandableStickyListHeadersListView listView; @Extra String mCommitsUrl; CommitsAdapter mAdapter; CommitPage mCommitPage; private View.OnClickListener mOnClickListItem = new View.OnClickListener() { @Override public void onClick(View v) { Commit commit = (Commit) v.getTag(); int start = mCommitsUrl.indexOf("/user/"); int end = mCommitsUrl.indexOf("/git/"); CommitFileListActivity_.intent(BranchCommitListActivity.this).mCommit(commit) .mProjectPath(mCommitsUrl.substring(start, end)).start(); } }; @AfterViews protected final void initBranchCommitListActivity() { mCommitPage = new CommitPage(mCommitsUrl); BaseCommentParam param = new BaseCommentParam(new ClickSmallImage(this), mOnClickListItem, new MyImageGetter(this), getImageLoad(), mOnClickUser); mAdapter = new CommitsAdapter(param); listView.setAdapter(mAdapter); mFootUpdate.init(listView, mInflater, this); onRefresh(); showDialogLoading(); listView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem + visibleItemCount == totalItemCount) { loadMore(); } } }); } @Override public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException { if (tag.equals(HOST_COMMITS_PAGER)) { hideProgressDialog(); setRefreshing(false); if (code == 0) { if (mCommitPage.isLoadingFirstPage()) { mAdapter.clearData(); } JSONObject jsonCommits = respanse.getJSONObject("data").getJSONObject("commits"); mCommitPage.setNextPage(jsonCommits); JSONArray jsonArray = jsonCommits.getJSONArray("list"); for (int i = 0; i < jsonArray.length(); ++i) { Commit commit = new Commit(jsonArray.getJSONObject(i)); mAdapter.appendData(commit); } mAdapter.notifyDataSetChanged(); } else { showErrorMsg(code, respanse); } mCommitPage.setLoading(false); mFootUpdate.updateState(code, mCommitPage.isLoadAll(), mAdapter.getCount()); } } @Override public void onRefresh() { initSetting(); mCommitPage.reset(); loadMore(); } @Override public void loadMore() { if (mCommitPage.isLoadAll()) { return; } String nextPageUrl = mCommitPage.getNextPageUrl(); if (mCommitPage.isLoading()) { return; } mCommitPage.setLoading(true); getNetwork(nextPageUrl, HOST_COMMITS_PAGER); } private static class CommitPage { final String mCommitsUrl; boolean mIsEnd = false; int mNextPage = 1; boolean mLoading = false; public CommitPage(String url) { mCommitsUrl = url; reset(); } public boolean isLoading() { return mLoading; } public void setLoading(boolean loading) { mLoading = loading; } public boolean isLoadingFirstPage() { return mNextPage == 1; } public boolean isLoadAll() { return mIsEnd; } public void reset() { mNextPage = 1; mIsEnd = false; } public void setNextPage(JSONObject json) { ++mNextPage; int count = json.optInt("pageSize", 0); int realData = json.optJSONArray("list").length(); if (realData < count) { mIsEnd = true; } } public String getNextPageUrl() { return String.format("%spage=%d", mCommitsUrl, mNextPage); } } // class PageCommitAdapter extends CommitsAdapter { // public PageCommitAdapter(BaseCommentParam param) { // super(param); // } // // @Override // public View getView(int position, View convertView, ViewGroup parent) { // if (getCount() - 1 <= position) { // loadMore(); // } // // return super.getView(position, convertView, parent); // } // } }