package org.softeg.slartus.forpdaplus.listfragments;/* * Created by slinkin on 10.04.2014. */ import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.os.Handler; import android.support.v4.widget.SwipeRefreshLayout; import android.view.KeyEvent; import android.view.View; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import org.softeg.slartus.forpdaapi.IListItem; import org.softeg.slartus.forpdaplus.App; import org.softeg.slartus.forpdaplus.R; import org.softeg.slartus.forpdaplus.controls.ListViewLoadMoreFooter; import org.softeg.slartus.forpdaplus.db.CacheDbHelper; import org.softeg.slartus.forpdaplus.listfragments.adapters.ListAdapter; import org.softeg.slartus.forpdaplus.prefs.Preferences; import org.softeg.sqliteannotations.BaseDao; import java.util.ArrayList; public abstract class BaseListFragment extends BaseBrickFragment implements AdapterView.OnItemClickListener { protected ArrayList<IListItem> mData = new ArrayList<>(); public static final String FIRST_VISIBLE_ROW_KEY = "FIRST_VISIBLE_ROW_KEY"; public static final String TOP_KEY = "TOP_KEY"; protected Handler mHandler = new Handler(); private int m_FirstVisibleRow = 0; private int m_Top = 0; public BaseListFragment() { super(); } @Override public void onCreate(android.os.Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { m_FirstVisibleRow = savedInstanceState.getInt(FIRST_VISIBLE_ROW_KEY, m_FirstVisibleRow); m_Top = savedInstanceState.getInt(TOP_KEY, m_Top); } } protected View getListViewHeader() { return null; } private ListView mListView; private TextView mEmptyTextView; protected int getViewId() { return R.layout.list_fragment; } @Override public android.view.View onCreateView(android.view.LayoutInflater inflater, android.view.ViewGroup container, android.os.Bundle savedInstanceState) { view = inflater.inflate(getViewId(), container, false); assert view != null; mListView = (ListView) findViewById(android.R.id.list); mListView.setOnItemClickListener(this); View header = getListViewHeader(); if (header != null) mListView.addHeaderView(header); mEmptyTextView = (TextView) findViewById(android.R.id.empty); mListView.setEmptyView(mEmptyTextView); return view; } @Override public void onSaveInstanceState(android.os.Bundle outState) { if (args != null) outState.putAll(args); outState.putInt(FIRST_VISIBLE_ROW_KEY, m_FirstVisibleRow); outState.putInt(TOP_KEY, m_Top); super.onSaveInstanceState(outState); } public void setCount() { int count = mAdapter.getCount(); mListViewLoadMoreFooter.setCount(count, count); mListViewLoadMoreFooter.setState(ListViewLoadMoreFooter.STATE_FULL_DOWNLOADED); } protected BaseAdapter mAdapter; protected ListViewLoadMoreFooter mListViewLoadMoreFooter; public Context getContext() { return getActivity(); } protected SwipeRefreshLayout mSwipeRefreshLayout; protected void saveListViewScrollPosition() { if (getListView() == null) return; m_FirstVisibleRow = getListView().getFirstVisiblePosition(); View v = getListView().getChildAt(0); m_Top = (v == null) ? 0 : v.getTop(); } protected void restoreListViewScrollPosition() { getListView().setSelectionFromTop(m_FirstVisibleRow, m_Top); } protected ListView getListView() { return mListView; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mListViewLoadMoreFooter = new ListViewLoadMoreFooter(view.getContext(), getListView()); mListViewLoadMoreFooter.setOnLoadMoreClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mListViewLoadMoreFooter.setState(ListViewLoadMoreFooter.STATE_LOADING); loadData(false); } }); mSwipeRefreshLayout = createSwipeRefreshLayout(view); } protected SwipeRefreshLayout createSwipeRefreshLayout(View view) { final SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.ptr_layout); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener(){ @Override public void onRefresh() { loadData(true); } }); swipeRefreshLayout.setColorSchemeResources(App.getInstance().getMainAccentColor()); swipeRefreshLayout.setProgressBackgroundColorSchemeResource(App.getInstance().getSwipeRefreshBackground()); return swipeRefreshLayout; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); registerForContextMenu(getListView()); setListShown(false); mAdapter = createAdapter(); setListAdapter(mAdapter); } private void setListAdapter(BaseAdapter mAdapter) { getListView().setAdapter(mAdapter); } protected void setListShown(boolean b) { //mListView.setVisibility(b?); } public BaseAdapter getAdapter() { return mAdapter; } private Runnable notifyAdapter = new Runnable() { @Override public void run() { getAdapter().notifyDataSetChanged(); } }; @Override public void onResume() { super.onResume(); if(getAdapter()!=null) mHandler.postDelayed(notifyAdapter, 300); } protected BaseAdapter createAdapter() { return new ListAdapter(getActivity(), mData, getPreferences().getBoolean("showSubMain", false)); } protected void setLoading(final Boolean loading) { try { if (getActivity() == null) return; //mSwipeRefreshLayout.setRefreshing(loading); mSwipeRefreshLayout.post(new Runnable() { @Override public void run() { mSwipeRefreshLayout.setRefreshing(loading); } }); if (loading) { setEmptyText(App.getContext().getString(R.string.loading)); } else { setEmptyText(App.getContext().getString(R.string.no_data)); } } catch (Throwable ignore) { android.util.Log.e("TAG", ignore.toString()); } } protected void setEmptyText(String s) { mEmptyTextView.setText(s); } @Override public void onItemClick(AdapterView<?> adapterView, View v, int position, long id) { } @Override public boolean dispatchKeyEvent(KeyEvent event) { if (!Preferences.Lists.getScrollByButtons()) return false; int action = event.getAction(); ListView scrollView = getListView(); int visibleItemsCount = scrollView.getLastVisiblePosition() - scrollView.getFirstVisiblePosition(); int keyCode = event.getKeyCode(); if (Preferences.System.isScrollUpButton(keyCode)) { if (action == KeyEvent.ACTION_DOWN) scrollView.setSelection(Math.max(scrollView.getFirstVisiblePosition() - visibleItemsCount, 0)); return true;// true надо обязательно возвращать даже если не ACTION_DOWN иначе звук нажатия } if (Preferences.System.isScrollDownButton(keyCode)) { if (action == KeyEvent.ACTION_DOWN) scrollView.setSelection(Math.min(scrollView.getLastVisiblePosition(), scrollView.getCount() - 1)); return true;// true надо обязательно возвращать даже если не ACTION_DOWN иначе звук нажатия } return false; } protected <T> void updateItemCache(final T item, final Class<T> tClass, Boolean newThread) { if (newThread) { new Thread(new Runnable() { @Override public void run() { updateItemCache(item, tClass); } }).start(); } else { updateItemCache(item, tClass); } } private <T> void updateItemCache(T item, Class<T> tClass) { try { CacheDbHelper cacheDbHelper = new CacheDbHelper(App.getContext()); SQLiteDatabase db = null; try { db = cacheDbHelper.getWritableDatabase(); BaseDao<T> baseDao = new BaseDao<>(App.getContext(), db, getListName(), tClass); baseDao.update(item, ((IListItem) item).getId().toString()); } finally { if (db != null) db.close(); } } catch (Throwable ex) { // Log.e(getContext(), ex); } } }