package org.softeg.slartus.forpdaplus.listfragments; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Spinner; import org.softeg.slartus.forpdaapi.ICatalogItem; import org.softeg.slartus.forpdaplus.common.AppLog; import org.softeg.slartus.forpdaplus.listfragments.adapters.CatalogAdapter; import org.softeg.slartus.forpdaplus.listfragments.adapters.CatalogCrumbsAdapter; import org.softeg.slartus.forpdaplus.tabs.ListViewMethodsBridge; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; public abstract class BaseCatalogFragment extends BaseTaskListFragment { public BaseCatalogFragment() { super(); } protected ICatalogItem m_CurrentCatalogItem; protected ICatalogItem m_LoadingCatalogItem; private Spinner m_FooterSpinner; private CatalogCrumbsAdapter m_CatalogCrumbsAdapter; protected Crumbs m_Crumbs = new Crumbs(); @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); m_FooterSpinner = new Spinner(view.getContext()); m_CatalogCrumbsAdapter = new CatalogCrumbsAdapter(view.getContext(), m_Crumbs); m_FooterSpinner.setAdapter(m_CatalogCrumbsAdapter); m_FooterSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { m_LoadingCatalogItem = (ICatalogItem) m_FooterSpinner.getSelectedItem(); assert m_LoadingCatalogItem != null; if (m_LoadingCatalogItem.getId().equals(m_CurrentCatalogItem.getId())) return; loadData(false); } @Override public void onNothingSelected(AdapterView<?> adapterView) { } }); getListView().addHeaderView(m_FooterSpinner); } @Override protected BaseAdapter createAdapter() { return new CatalogAdapter(getActivity(), new ArrayList<ICatalogItem>()); } @Override protected final boolean inBackground(boolean isRefresh) throws IOException, ParseException { return false; } @Override protected Task createTask(Boolean isRefresh) { if (isRefresh) m_LoadingCatalogItem = m_CurrentCatalogItem == null ? null : m_CurrentCatalogItem.clone(); return new CatalogTask(isRefresh, m_LoadingCatalogItem); } @Override public boolean onBackPressed() { if (m_Crumbs.size() < 2) return false; m_LoadingCatalogItem = m_Crumbs.get(m_Crumbs.size() - 2).clone(); loadData(false); return true; } public void onCatalogItemClick(ICatalogItem catalogItem) { m_LoadingCatalogItem = catalogItem == null ? null : catalogItem.clone(); loadData(false); } @Override protected void deliveryResult(boolean isRefresh) { m_CurrentCatalogItem = m_LoadingCatalogItem == null ? null : m_LoadingCatalogItem.clone(); rebuildCrumbs(m_CurrentCatalogItem); } protected void rebuildCrumbs(ICatalogItem catalogItem) { assert catalogItem != null; m_Crumbs.rebuildCrumbs(catalogItem.clone()); if (m_CatalogCrumbsAdapter != null) m_CatalogCrumbsAdapter.notifyDataSetChanged(); if (m_FooterSpinner != null) m_FooterSpinner.setSelection(m_Crumbs.size() - 1); } @Override public void onItemClick(AdapterView<?> adapterView, View v, int position, long id) { try { id = ListViewMethodsBridge.getItemId(getActivity(), position, id); if (id < 0 || getAdapter().getCount() <= id) return; Object o = getAdapter().getItem((int) id); if (o == null) return; final ICatalogItem item = (ICatalogItem) o; if (TextUtils.isEmpty(item.getId())) return; onCatalogItemClick(item); } catch (Throwable ex) { AppLog.e(getActivity(), ex); } } protected int getCatalogIndexById(ArrayList<? extends ICatalogItem> collection, ICatalogItem catalogItem) { for (int i = 0; i < collection.size(); i++) { ICatalogItem item = collection.get(i); if (item.getId().equals(catalogItem.getId())) return i; } return -1; } protected abstract boolean inBackground(boolean isRefresh, ICatalogItem catalogItem) throws Throwable; public class CatalogTask extends Task { private ICatalogItem mCatalogItem; public CatalogTask(Boolean refresh, ICatalogItem catalogItem) { super(refresh); mCatalogItem = catalogItem; } @Override protected Boolean doInBackground(Boolean[] p1) { try { return inBackground(mRefresh, mCatalogItem); } catch (Throwable e) { mEx = e; } return false; } } public class Crumbs extends ArrayList<ICatalogItem> { public void rebuildCrumbs(ICatalogItem catalogItem) { clear(); while (catalogItem != null) { add(0, catalogItem); catalogItem = catalogItem.getParent(); } } } }