/* * ****************************************************************************** * 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.extras.fragment.twowayview; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.os.SystemClock; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.RatingBar; import android.widget.TextView; import android.widget.Toast; import org.lucasr.twowayview.TwoWayLayoutManager; import org.lucasr.twowayview.widget.SpacingItemDecoration; import org.lucasr.twowayview.widget.SpannableGridLayoutManager; import java.util.ArrayList; import java.util.List; import it.gmariotti.cardslib.demo.extras.R; import it.gmariotti.cardslib.demo.extras.fragment.BaseListFragment; import it.gmariotti.cardslib.library.extra.twoway.view.CardTwowayView; import it.gmariotti.cardslib.library.internal.Card; 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.recyclerview.internal.CardArrayRecyclerViewAdapter; /** * This example uses a staggered card with different different photos and text. * <p/> * This example uses cards with a foreground layout. * Pay attention to style="@style/card.main_layout_foreground" in card layout. * <p/> * .DynamicHeightPicassoCardThumbnailView * * @author Gabriele Mariotti (gabri.mariotti@gmail.com) */ public class SpannableGrid2wayFragment extends BaseListFragment { CardArrayRecyclerViewAdapter mCardArrayAdapter; CardTwowayView mRecyclerView; public SpannableGrid2wayFragment() { super(); } @Override public int getTitleResourceId() { return R.string.carddemo_extras_title_spannable2viewway; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.demo_extras_fragment_spannablegrid_twowayview, container, false); setupListFragment(root); return root; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); hideList(false); //Set the arrayAdapter ArrayList<Card> cards = new ArrayList<Card>(); mCardArrayAdapter = new SpanCardArrayRecyclerViewAdapter(getActivity(), cards); //Staggered grid view mRecyclerView = (CardTwowayView) getActivity().findViewById(R.id.carddemo_extras_span_2wayview); mRecyclerView.setHasFixedSize(false); mRecyclerView.addItemDecoration(new SpacingItemDecoration(16,16)); //Set the empty view if (mRecyclerView != null) { mRecyclerView.setAdapter(mCardArrayAdapter); } //Load cards new LoaderAsyncTask().execute(); } class SpanCardArrayRecyclerViewAdapter extends CardArrayRecyclerViewAdapter{ /** * Constructor * * @param context The current context. * @param cards The cards to represent in the ListView. */ public SpanCardArrayRecyclerViewAdapter(Context context, List<Card> cards) { super(context, cards); } @Override public void onBindViewHolder(CardViewHolder cardViewHolder, int position) { super.onBindViewHolder(cardViewHolder, position); boolean isVertical = (mRecyclerView.getOrientation() == TwoWayLayoutManager.Orientation.VERTICAL); final View itemView = cardViewHolder.itemView; final SpannableGridLayoutManager.LayoutParams lp = (SpannableGridLayoutManager.LayoutParams) itemView.getLayoutParams(); GPlayCommonCard card = (GPlayCommonCard) getItem(position); final int colSpan = card.colSpan; final int rowSpan = card.rowSpan; if (lp.rowSpan != rowSpan || lp.colSpan != colSpan) { lp.rowSpan = rowSpan; lp.colSpan = colSpan; itemView.setLayoutParams(lp); } } } //------------------------------------------------------------------------------------------------------------- // Loader //------------------------------------------------------------------------------------------------------------- /** * Async Task to elaborate images */ class LoaderAsyncTask extends AsyncTask<Void, Void, ArrayList<Card>> { LoaderAsyncTask() { } @Override protected ArrayList<Card> doInBackground(Void... params) { //elaborate images SystemClock.sleep(1000); //delay to simulate download, don't use it in a real app ArrayList<Card> cards = initCard(); return cards; } @Override protected void onPostExecute(ArrayList<Card> cards) { //Update the adapter updateAdapter(cards); displayList(); } } /** * This method builds a simple list of cards */ private ArrayList<Card> initCard() { int numCols = getResources().getInteger(R.integer.carddemo_extra_spannedgrid_numcols); ArrayList<Card> cards = new ArrayList<Card>(); for (int i = 0; i < 100; i++) { GPlayCommonCard card; if (i == 0 || i % numCols == 0){ card = new GPlayGridCardLarge(getActivity()); card.secondaryTitle = "Lorem ipsum dolor sit amet, consectetur adipisci elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi" + i; }else{ card = new GplayGridCard(getActivity()); card.secondaryTitle = "Some text here " + i; } //Only for test, use different titles and ratings card.headerTitle = "App example " + i; card.rating = (float) (Math.random() * (5.0)); //Only for test, change some icons if ((i % 6 == 0)) { card.resourceIdThumbnail = R.drawable.ic_ic_dh_bat; } else if ((i % 6 == 1)) { card.resourceIdThumbnail = R.drawable.ic_ic_dh_net; } else if ((i % 6 == 2)) { card.resourceIdThumbnail = R.drawable.ic_tris; } else if ((i % 6 == 3)) { card.resourceIdThumbnail = R.drawable.ic_info; } else if ((i % 6 == 4)) { card.resourceIdThumbnail = R.drawable.ic_smile; } card.init(); cards.add(card); } return cards; } /** * Update the adapter */ private void updateAdapter(ArrayList<Card> cards) { if (cards != null) { mCardArrayAdapter.addAll(cards); //mCardArrayAdapter.notifyDataSetChanged(); } } //------------------------------------------------------------------------------------------------------------- // Cards //------------------------------------------------------------------------------------------------------------- public class SpannedCommonCard extends Card { public int rowSpan = 1; public int colSpan = 1; public SpannedCommonCard(Context context, int innerLayout) { super(context, innerLayout); } } public class GPlayCommonCard extends SpannedCommonCard { protected TextView mTitle; protected TextView mSecondaryTitle; protected RatingBar mRatingBar; protected int resourceIdThumbnail = -1; protected int count; protected String headerTitle; protected String secondaryTitle; protected float rating; public GPlayCommonCard(Context context, int innerLayout) { super(context, innerLayout); } public void init() { //Add header with the overflow button CardHeader header = new CardHeader(getContext()); header.setButtonOverflowVisible(true); header.setTitle(headerTitle); header.setPopupMenu(R.menu.extras_popupmain, new CardHeader.OnClickCardHeaderPopupMenuListener() { @Override public void onMenuItemClick(BaseCard card, MenuItem item) { Toast.makeText(getContext(), "Item " + item.getTitle(), Toast.LENGTH_SHORT).show(); } }); addCardHeader(header); //Add thumbnail GplayGridThumb thumbnail = new GplayGridThumb(getContext()); if (resourceIdThumbnail > -1) thumbnail.setDrawableResource(resourceIdThumbnail); else thumbnail.setDrawableResource(R.drawable.ic_ic_launcher_web); addCardThumbnail(thumbnail); //Listeners setOnClickListener(new OnCardClickListener() { @Override public void onClick(Card card, View view) { //Do something } }); } @Override public void setupInnerViewElements(ViewGroup parent, View view) { //Populate the inner elements TextView title = (TextView) view.findViewById(R.id.carddemo_extras_gplay_main_inner_title); title.setText("FREE"); TextView subtitle = (TextView) view.findViewById(R.id.carddemo_extras_gplay_main_inner_subtitle); subtitle.setText(secondaryTitle); RatingBar mRatingBar = (RatingBar) parent.findViewById(R.id.carddemo_extras_gplay_main_inner_ratingBar); mRatingBar.setNumStars(5); mRatingBar.setMax(5); mRatingBar.setStepSize(0.5f); mRatingBar.setRating(rating); } /** * CardThumbnail */ class GplayGridThumb extends CardThumbnail { public GplayGridThumb(Context context) { super(context); } @Override public void setupInnerViewElements(ViewGroup parent, View viewImage) { /* viewImage.getLayoutParams().width = 196; viewImage.getLayoutParams().height = 196; */ } } } /** * A card as Google Play */ public class GplayGridCard extends GPlayCommonCard { public GplayGridCard(Context context) { super(context, R.layout.carddemo_extras_gplay_inner_content); } } public class GPlayGridCardLarge extends GPlayCommonCard{ public GPlayGridCardLarge(Context context) { super(context, R.layout.carddemo_extras_gplay_inner_large_content); super.colSpan = 2; } @Override public int getType() { return 1; } } }