package com.jobmineplus.mobile.activities.jbmnpls; import java.util.ArrayList; import android.os.Bundle; import android.support.v7.internal.view.menu.SubMenuBuilder; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.TextView; import com.jobmineplus.mobile.R; import com.jobmineplus.mobile.database.pages.PageResult; import com.jobmineplus.mobile.exceptions.JbmnplsException; import com.jobmineplus.mobile.widgets.JbmnplsAdapterBase; import com.jobmineplus.mobile.widgets.JbmnplsAdapterBase.HIGHLIGHTING; import com.jobmineplus.mobile.widgets.JbmnplsLoadingAdapterBase; import com.jobmineplus.mobile.widgets.Job; import com.jobmineplus.mobile.widgets.Job.HEADER; import com.jobmineplus.mobile.widgets.Job.HeaderComparator; import com.jobmineplus.mobile.widgets.Job.HeaderComparator.DIRECTION; public abstract class JbmnplsListActivityBase extends JbmnplsActivityBase implements OnItemClickListener{ //================= // Declarations //================= private ListView list; private TextView emptyText; private JbmnplsAdapterBase adapter; private MenuItem sortSelected; private boolean sortedAscending = false; private final HeaderComparator sortComparer = new Job.HeaderComparator(); //==================== // Abstract Methods //==================== public abstract HEADER[] getTableHeaders(); public abstract int[] getJobListItemResources(); protected abstract HIGHLIGHTING formatJobListItem(int position, Job job, View[] elements, View layout); //==================== // Override Methods //==================== @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (findViewById(android.R.id.empty) == null) { setContentView(R.layout.joblist); } list = (ListView) findViewById(R.id.list); emptyText = (TextView) findViewById(android.R.id.empty); list.setVisibility(View.INVISIBLE); list.setEmptyView(emptyText); list.setOnItemClickListener(this); // Set up the adapter adapter = new JbmnplsListAdapter(this); list.setAdapter(adapter); } @Override protected void onResume() { super.onResume(); if (adapter != null) { adapter.notifyDataSetChanged(); } } @Override protected long doOffine() { PageResult result = pageDataSource.getPageData(client.getUsername(), getPageName()); if (result != null) { ArrayList<Integer> ids = result.ids; allJobs.clear(); if (ids != null) { ArrayList<Job> jobs = jobDataSource.getJobsByIdList(ids); for (Job job : jobs) { allJobs.add(job); } } return result.timestamp; } return 0; } @Override protected void onRequestComplete(boolean pullData) { updateList(); emptyText.setVisibility(View.VISIBLE); if (pullData) { jobsToDatabase(); } } @Override protected int getActionBarId() { return R.menu.actionbar_with_sort; } @Override public boolean onCreateOptionsMenu(Menu menu) { boolean flag = super.onCreateOptionsMenu(menu); MenuItem item = menu.findItem(R.id.action_sort); SubMenu sub = item.getSubMenu(); sub.clear(); // Because SherlockActionBar renders text differently, the tabbing is different String prefex = sub instanceof SubMenuBuilder ? " \t" : " \t\t"; HEADER[] headers = getTableHeaders(); for (int i = 0; i < headers.length; i++) { HEADER header = headers[i]; sub.add(1, i, Menu.NONE, prefex + header.readable()); } return flag; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); HEADER[] headers = getTableHeaders(); if (id >= 0 && id < headers.length) { if (sortSelected != null && item != sortSelected) { sortSelected.setTitle(" " + ((String)sortSelected.getTitle()).substring(1)); sortedAscending = true; } else { sortedAscending = !sortedAscending; } item.setTitle((sortedAscending ? "��" : "��") + ((String)item.getTitle()).substring(1)); sort(headers[id], sortedAscending); sortSelected = item; return true; } else { return super.onOptionsItemSelected(item); } } //================================= // Sorting //================================= protected void sort(HEADER header) { sort(header, true); } protected void sort(HEADER header, boolean ascend) { sortComparer.setHeader(header); sortComparer.setDirection(ascend ? DIRECTION.ASCEND : DIRECTION.DESCEND); adapter.sort(sortComparer); } protected void resetSortingMenu() { if (sortSelected != null) { sortSelected.setTitle(" " + ((String)sortSelected.getTitle()).substring(1)); } sortedAscending = false; } //================================= // Class Public/Protected Methods //================================= protected void updateList() throws JbmnplsException{ adapter.notifyDataSetChanged(); if (!adapter.isEmpty()) { list.setVisibility(View.VISIBLE); } } protected ListView getListView() { return list; } protected JbmnplsAdapterBase getAdapter() { return adapter; } protected void scrollToTop() { list.setSelectionAfterHeaderView(); } protected ArrayList<Job> getList() { return allJobs; } protected void clearList() { allJobs.clear(); } //======================== // Generic List Adapter //======================== protected int getJobListItemLayout() { return R.layout.job_widget; } private class JbmnplsListAdapter extends JbmnplsLoadingAdapterBase { public JbmnplsListAdapter(JbmnplsListActivityBase a) { super(a, getJobListItemLayout(), getJobListItemResources(), a.getList()); } @Override protected HIGHLIGHTING setJobWidgetValues(int position, Job job, View[] elements, View layout) { return formatJobListItem(position, job, elements, layout); } } }