package net.oschina.gitapp.ui; import java.util.ArrayList; import java.util.List; import android.os.AsyncTask; import android.os.Bundle; import android.os.Message; import android.support.v7.app.ActionBar; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import net.oschina.gitapp.AppContext; import net.oschina.gitapp.AppException; import net.oschina.gitapp.R; import net.oschina.gitapp.adapter.ExploreListProjectAdapter; import net.oschina.gitapp.adapter.LanguageListAdapter; import net.oschina.gitapp.bean.CommonList; import net.oschina.gitapp.bean.Language; import net.oschina.gitapp.bean.MessageData; import net.oschina.gitapp.bean.Project; import net.oschina.gitapp.common.DataRequestThreadHandler; import net.oschina.gitapp.common.UIHelper; import net.oschina.gitapp.ui.baseactivity.BaseActionBarActivity; public class LanguageActivity extends BaseActionBarActivity implements android.support.v7.app.ActionBar.OnNavigationListener, OnItemClickListener{ /** * The serialization (saved instance state) Bundle key representing the * current dropdown position. */ private static final String STATE_SELECTED_NAVIGATION_ITEM = "selected_navigation_item"; private AppContext mContext; private ListView mListView; private View mFooterView; private TextView mFooterTextView; private ProgressBar mFooterProgressBar; private List<Project> mProjects; private ExploreListProjectAdapter mProjectAdapter; private List<Language> mLanguages; private LanguageListAdapter mLanguageAdapter; private ProgressBar mLoading; private DataRequestThreadHandler mRequestThreadHandler = new DataRequestThreadHandler(); private int mMessageState = MessageData.MESSAGE_STATE_MORE; private String mLanguageId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_language); mContext = getGitApplication(); mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); initView(); initData(); steupList(); loadLanguagesList(); } @Override protected void onDestroy() { super.onDestroy(); mRequestThreadHandler.quit(); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { // Restore the previously serialized current dropdown position. if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)) { getActionBar().setSelectedNavigationItem( savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM)); } } private void initView() { mLoading = (ProgressBar) findViewById(R.id.loading); mListView = (ListView) findViewById(R.id.project_list); mFooterView = LayoutInflater.from(mContext).inflate(R.layout.listview_footer, null); mFooterProgressBar = (ProgressBar) mFooterView.findViewById(R.id.listview_foot_progress); mFooterTextView = (TextView) mFooterView.findViewById(R.id.listview_foot_more); } private void initData() { mProjects = new ArrayList<Project>(); mProjectAdapter = new ExploreListProjectAdapter(mContext, mProjects, R.layout.exploreproject_listitem); mLanguages = new ArrayList<Language>(); mLanguageAdapter = new LanguageListAdapter(mContext, mLanguages, R.layout.languages); mActionBar.setListNavigationCallbacks(mLanguageAdapter, this); } private void steupList() { mListView.addFooterView(mFooterView); mListView.setAdapter(mProjectAdapter); mListView.setOnItemClickListener(this); } @Override public void onResume() { super.onResume(); } private void beforeLoading(int page) { if (page == 1 || page == 0) { mLoading.setVisibility(View.VISIBLE); mListView.setVisibility(View.GONE); mProjects.clear(); } else { setFooterLoadingState(); } } private void afterLoading(boolean isEmpty) { mLoading.setVisibility(View.GONE); if (isEmpty) { } else { mListView.setVisibility(View.VISIBLE); } } private void loadProjects(final String languageId, final int page) { if (mLanguages.isEmpty()) { setFooterNotLanguages(); return; } mRequestThreadHandler.request(page, new AsyncDataHandler(languageId, page)); } void setFooterNotLanguages() { if(mFooterView != null) { mFooterProgressBar.setVisibility(View.GONE); mFooterTextView.setText("没有加载到语言列表"); } } /** 设置底部有错误的状态*/ void setFooterErrorState() { if(mFooterView != null) { mFooterProgressBar.setVisibility(View.GONE); mFooterTextView.setText(R.string.load_error); } } /** 设置底部有更多数据的状态*/ void setFooterHasMoreState() { if(mFooterView != null) { mFooterProgressBar.setVisibility(View.GONE); mFooterTextView.setText(R.string.load_more); } } /** 设置底部已加载全部的状态*/ void setFooterFullState() { if(mFooterView != null) { mFooterProgressBar.setVisibility(View.GONE); mFooterTextView.setText(R.string.load_full); } } /** 设置底部无数据的状态*/ void setFooterNoMoreState() { if(mFooterView != null) { mFooterProgressBar.setVisibility(View.GONE); mFooterTextView.setText(R.string.load_empty); } } /** 设置底部加载中的状态*/ void setFooterLoadingState() { if(mFooterView != null) { mFooterProgressBar.setVisibility(View.VISIBLE); mFooterTextView.setText(R.string.load_ing); } } class AsyncDataHandler implements DataRequestThreadHandler.AsyncDataHandler<Message> { private int page; private String languageId; AsyncDataHandler(String languageId, int page) { this.page = page; this.languageId = languageId; } @Override public void onPreExecute() { beforeLoading(page); } @Override public Message execute() { Message msg = new Message(); try { msg.obj = mContext.getLanguageProjectList(languageId, page); msg.what = 1; } catch (AppException e) { msg.what = -1; msg.obj = e; e.printStackTrace(); } return msg; } @SuppressWarnings("unchecked") @Override public void onPostExecute(Message msg) { afterLoading(false); if (msg.what == 1) { List<Project> projects = (List<Project>) msg.obj; if (projects != null) { if (projects.size() < 20) { mMessageState = MessageData.MESSAGE_STATE_FULL; if (page == 1 && projects.size() == 0) { setFooterNoMoreState(); } else { setFooterFullState(); } } else { setFooterHasMoreState(); } mProjects.addAll(projects); mProjectAdapter.notifyDataSetChanged(); } } else { setFooterErrorState(); ((AppException)msg.obj).makeToast(mContext); } } } // 加载语言列表 private void loadLanguagesList() { new AsyncTask<Void, Void, Message>() { @Override protected Message doInBackground(Void... params) { Message msg = new Message(); try { msg.obj = mContext.getLanguageList(); msg.what = 1; } catch (AppException e) { msg.what = -1; msg.obj = e; e.printStackTrace(); } return msg; } @Override protected void onPreExecute() { super.onPreExecute(); beforeLoading(0); } @SuppressWarnings("unchecked") @Override protected void onPostExecute(Message msg) { super.onPostExecute(msg); afterLoading(false); if (msg.what == 1) { CommonList<Language> languages = (CommonList<Language>) msg.obj; if (languages != null && languages.getCount() > 0) { mLanguages.addAll(languages.getList()); mLanguageAdapter.notifyDataSetChanged(); } else { setFooterNotLanguages(); } } else { } } }.execute(); } @Override public boolean onNavigationItemSelected(int arg0, long arg1) { Language language = mLanguages.get(arg0); mLanguageId = language.getId(); mMessageState = MessageData.MESSAGE_STATE_MORE; loadProjects(mLanguageId, 1); return true; } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (view == mFooterView) { if (mMessageState != MessageData.MESSAGE_STATE_FULL) { // 当前pageIndex int pageIndex = mProjects.size() / AppContext.PAGE_SIZE + 1; loadProjects(mLanguageId, pageIndex); } return; } Project p = mProjects.get(position); UIHelper.showProjectDetail(mContext, p, p.getId()); } }