/* * ****************************************************************************** * Copyright (c) 2013-2014 Gabriele Mariotti. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ***************************************************************************** */ package it.gmariotti.cardslib.demo.fragment.v1; import android.app.LoaderManager; import android.content.Context; import android.content.CursorLoader; import android.content.Loader; import android.database.Cursor; import android.os.Bundle; import android.util.SparseBooleanArray; import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import it.gmariotti.cardslib.demo.R; import it.gmariotti.cardslib.demo.db.CardCursorContract; import it.gmariotti.cardslib.library.internal.Card; import it.gmariotti.cardslib.library.internal.CardCursorMultiChoiceAdapter; import it.gmariotti.cardslib.library.internal.CardHeader; import it.gmariotti.cardslib.library.internal.CardThumbnail; import it.gmariotti.cardslib.library.internal.base.BaseCard; import it.gmariotti.cardslib.library.view.CardListView; import it.gmariotti.cardslib.library.view.base.CardViewWrapper; /** * List of Google Play cards Example with MultiChoice and CursorAdapter * * @author Gabriele Mariotti (gabri.mariotti@gmail.com) */ public class ListGplayCursorCardCABFragment extends BaseListFragment implements LoaderManager.LoaderCallbacks<Cursor> { MyCardCursorMultiChoiceAdapter mAdapter; CardListView listView; ActionMode mActionMode; @Override protected int getSubTitleHeaderResourceId() { return R.string.header_title_subtitle_cab_lcursor; } @Override protected int getTitleHeaderResourceId() { return R.string.header_title_group4; } @Override protected String getDocUrl() { return "https://github.com/gabrielemariotti/cardslib/blob/master/doc/LIST.md"; } @Override protected String getSourceUrl() { return "https://github.com/gabrielemariotti/cardslib/blob/master/demo/stock/src/main/java/it/gmariotti/cardslib/demo/fragment/v1/ListGplayCursorCardCABFragment.java"; } @Override public int getTitleResourceId() { return R.string.carddemo_title_cab_list_cursor; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.demo_fragment_list_gplaycard_cab, container, false); setupListFragment(root); return root; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); hideList(false); init(); } @Override public void onDetach() { super.onDetach(); if (mActionMode!=null){ mActionMode.finish(); } } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { Loader<Cursor> loader = null; loader = new CursorLoader(getActivity(), CardCursorContract.CardCursor.CONTENT_URI, CardCursorContract.CardCursor.ALL_PROJECTION, null , null, CardCursorContract.CardCursor.DEFAULT_SORT); return loader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { if (getActivity() == null) { return; } mAdapter.swapCursor(data); displayList(); } @Override public void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } private void init() { //Set the arrayAdapter mAdapter = new MyCardCursorMultiChoiceAdapter(getActivity()); //ListView listView = (CardListView) getActivity().findViewById(R.id.carddemo_list_gplaycard_cab); if (listView != null) { listView.setAdapter(mAdapter); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); } // Force start background query to load sessions getLoaderManager().restartLoader(0, null, this); } //------------------------------------------------------------------------------------------------------------- // Cards //------------------------------------------------------------------------------------------------------------- public class MyCursorCard extends Card { String mainTitle; String secondaryTitle; String mainHeader; int position, resourceIdThumb; public MyCursorCard(Context context) { super(context, R.layout.carddemo_cursor_inner_content); } @Override public void setupInnerViewElements(ViewGroup parent, View view) { //Retrieve elements TextView mTitleTextView = (TextView) parent.findViewById(R.id.carddemo_cursor_main_inner_title); TextView mSecondaryTitleTextView = (TextView) parent.findViewById(R.id.carddemo_cursor_main_inner_subtitle); if (mTitleTextView != null) mTitleTextView.setText(mainTitle); if (mSecondaryTitleTextView != null) mSecondaryTitleTextView.setText(secondaryTitle); } } //------------------------------------------------------------------------------------------------------------- // Adapter //------------------------------------------------------------------------------------------------------------- public class MyCardCursorMultiChoiceAdapter extends CardCursorMultiChoiceAdapter { public MyCardCursorMultiChoiceAdapter(Context context) { super(context); } @Override protected Card getCardFromCursor(Cursor cursor) { MyCursorCard card = new MyCursorCard(super.getContext()); setCardFromCursor(card,cursor); //Create a CardHeader CardHeader header = new CardHeader(getActivity()); //Set the header title header.setTitle(card.mainHeader); header.setPopupMenu(R.menu.popupmain, new CardHeader.OnClickCardHeaderPopupMenuListener() { @Override public void onMenuItemClick(BaseCard card, MenuItem item) { Toast.makeText(getContext(), "Click on card="+card.getId()+" item=" + item.getTitle(), Toast.LENGTH_SHORT).show(); } }); //Add Header to card card.addCardHeader(header); //Add the thumbnail CardThumbnail thumb = new CardThumbnail(getActivity()); thumb.setDrawableResource(card.resourceIdThumb); card.addCardThumbnail(thumb); //It is very important. //You have to implement this onLongClickListener in your cards to enable the multiChoice card.setOnLongClickListener(new Card.OnLongCardClickListener() { @Override public boolean onLongClick(Card card, View view) { return startActionMode(getActivity()); } }); //Simple clickListener card.setOnClickListener(new Card.OnCardClickListener() { @Override public void onClick(Card card, View view) { Toast.makeText(getContext(), "Card id=" + card.getId() + " Title=" + card.getCardHeader().getTitle(), Toast.LENGTH_SHORT).show(); } }); return card; } private void setCardFromCursor(MyCursorCard card,Cursor cursor) { card.position=cursor.getPosition(); card.mainTitle=cursor.getString(CardCursorContract.CardCursor.IndexColumns.TITLE_COLUMN); card.secondaryTitle=cursor.getString(CardCursorContract.CardCursor.IndexColumns.SUBTITLE_COLUMN); card.mainHeader=cursor.getString(CardCursorContract.CardCursor.IndexColumns.HEADER_COLUMN); card.setId(""+cursor.getInt(CardCursorContract.CardCursor.IndexColumns.ID_COLUMN)); //Only for test, use different images int thumb = cursor.getInt(CardCursorContract.CardCursor.IndexColumns.THUMBNAIL_COLUMN); switch (thumb){ case 0: card.resourceIdThumb=R.drawable.ic_ic_launcher_web; break; case 1: card.resourceIdThumb=R.drawable.ic_ic_dh_net; break; case 2: card.resourceIdThumb=R.drawable.ic_tris; break; case 3: card.resourceIdThumb=R.drawable.ic_info; break; case 4: card.resourceIdThumb=R.drawable.ic_smile; break; } } @Override public int getPosition(Card card) { return ((MyCursorCard)card).position; } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { //It is very important to call the super method super.onCreateActionMode(mode, menu); mActionMode=mode; // to manage mode in your Fragment/Activity //If you would like to inflate your menu MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.carddemo_multichoice, menu); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { if (item.getItemId() == R.id.menu_share) { Toast.makeText(getContext(), "Share;" + formatCheckedCard(), Toast.LENGTH_SHORT).show(); return true; } if (item.getItemId() == R.id.menu_discard) { discardSelectedItems(mode); return true; } return false; } @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked, CardViewWrapper cardView, Card card) { Toast.makeText(getContext(), "Click;" + position + " - " + checked, Toast.LENGTH_SHORT).show(); } private void discardSelectedItems(ActionMode mode) { Toast.makeText(getContext(), "Not implemented in this demo", Toast.LENGTH_SHORT).show(); } private String formatCheckedCard() { SparseBooleanArray checked = mCardListView.getCheckedItemPositions(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < checked.size(); i++) { if (checked.valueAt(i) == true) { sb.append("\nPosition=" + checked.keyAt(i)); } } return sb.toString(); } } }