/*
* ******************************************************************************
* 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.library.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.GridView;
import android.widget.ListAdapter;
import it.gmariotti.cardslib.library.R;
import it.gmariotti.cardslib.library.internal.CardGridArrayAdapter;
import it.gmariotti.cardslib.library.internal.CardGridCursorAdapter;
import it.gmariotti.cardslib.library.view.base.CardViewWrapper;
/**
* Card Grid View.
* It uses an {@link it.gmariotti.cardslib.library.internal.CardGridArrayAdapter} to populate items.
* </p>
* Usage:
* <pre><code>
* <it.gmariotti.cardslib.library.view.CardGridView
* android:layout_width="match_parent"
* android:layout_height="match_parent"
* android:columnWidth="190dp"
* android:numColumns="auto_fit"
* android:verticalSpacing="3dp"
* android:horizontalSpacing="2dp"
* android:stretchMode="columnWidth"
* android:gravity="center"
* android:id="@+id/carddemo_grid_base1"/>
* </code></pre>
* It provides a default layout id for each row @layout/list_card_layout
* Use can easily customize it using card:list_card_layout_resourceID attr in your xml layout.
* </p>
* Use this code to populate the grid view
* <pre><code>
* CardGridView gridView = (CardGridView) getActivity().findViewById(R.id.gridId);
* gridView.setAdapter(mCardGridArrayAdapter);
* </code></pre>
* This type of view, doesn't support swipe and collapse/expand actions.
* </p>
* Currently you have to use the same inner layout for each card in gridView.
* </p>
* @author Gabriele Mariotti (gabri.mariotti@gmail.com)
*/
public class CardGridView extends GridView implements CardViewWrapper.OnExpandListAnimatorListener {
protected static String TAG = "CardGridView";
/**
* Card Grid Array Adapter
*/
protected CardGridArrayAdapter mAdapter;
/**
* Card Cursor Adapter
*/
protected CardGridCursorAdapter mCursorAdapter;
//--------------------------------------------------------------------------
// Custom Attrs
//--------------------------------------------------------------------------
/**
* Default layout to apply to card
*/
protected int list_card_layout_resourceID = R.layout.list_card_layout;
//--------------------------------------------------------------------------
// Constructors
//--------------------------------------------------------------------------
public CardGridView(Context context) {
super(context);
init(null, 0);
}
public CardGridView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs, 0);
}
public CardGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs, defStyle);
}
//--------------------------------------------------------------------------
// Init
//--------------------------------------------------------------------------
/**
* Initialize
*
* @param attrs
* @param defStyle
*/
protected void init(AttributeSet attrs, int defStyle){
//Init attrs
initAttrs(attrs,defStyle);
}
/**
* Init custom attrs.
*
* @param attrs
* @param defStyle
*/
protected void initAttrs(AttributeSet attrs, int defStyle) {
list_card_layout_resourceID = R.layout.list_card_layout;
TypedArray a = getContext().getTheme().obtainStyledAttributes(
attrs, R.styleable.card_options, defStyle, defStyle);
try {
list_card_layout_resourceID = a.getResourceId(R.styleable.card_options_list_card_layout_resourceID, this.list_card_layout_resourceID);
} finally {
a.recycle();
}
}
//--------------------------------------------------------------------------
// Adapter
//--------------------------------------------------------------------------
/**
* Forces to use a {@link CardGridArrayAdapter}
*
* @param adapter
*/
@Override
public void setAdapter(ListAdapter adapter) {
if (adapter instanceof CardGridArrayAdapter){
setAdapter((CardGridArrayAdapter)adapter);
}else if (adapter instanceof CardGridCursorAdapter){
setAdapter((CardGridCursorAdapter)adapter);
}else{
Log.w(TAG,"You are using a generic adapter. Pay attention: your adapter has to call cardGridArrayAdapter#getView method." );
super.setAdapter(adapter);
}
}
/**
* Set {@link CardGridArrayAdapter} and layout used by items in ListView
*
* @param adapter {@link CardGridArrayAdapter}
*/
public void setAdapter(CardGridArrayAdapter adapter) {
super.setAdapter(adapter);
//Set Layout used by items
adapter.setRowLayoutId(list_card_layout_resourceID);
adapter.setCardGridView(this);
mAdapter=adapter;
}
/**
* Set {@link it.gmariotti.cardslib.library.internal.CardGridCursorAdapter} and layout used by items in ListView
*
* @param adapter {@link it.gmariotti.cardslib.library.internal.CardGridCursorAdapter}
*/
public void setAdapter(CardGridCursorAdapter adapter) {
super.setAdapter(adapter);
//Set Layout used by items
adapter.setRowLayoutId(list_card_layout_resourceID);
adapter.setCardGridView(this);
mCursorAdapter=adapter;
}
/**
* You can use this method, if you are using external adapters.
* Pay attention. The generic adapter#getView() method has to call the cardArrayAdapter#getView() method to work.
*
* @param adapter {@link ListAdapter} generic adapter
* @param cardGridArrayAdapter {@link it.gmariotti.cardslib.library.internal.CardGridArrayAdapter} cardGridArrayAdapter
*/
public void setExternalAdapter(ListAdapter adapter, CardGridArrayAdapter cardGridArrayAdapter) {
setAdapter(adapter);
mAdapter=cardGridArrayAdapter;
mAdapter.setCardGridView(this);
mAdapter.setRowLayoutId(list_card_layout_resourceID);
}
/**
* You can use this method, if you are using external adapters.
* Pay attention. The generic adapter#getView() method has to call the cardCursorAdapter#getView() method to work.
*
* @param adapter {@link ListAdapter} generic adapter
* @param cardCursorAdapter {@link it.gmariotti.cardslib.library.internal.CardCursorAdapter} cardArrayAdapter
*/
public void setExternalAdapter(ListAdapter adapter, CardGridCursorAdapter cardCursorAdapter) {
setAdapter(adapter);
mCursorAdapter=cardCursorAdapter;
mCursorAdapter.setCardGridView(this);
mCursorAdapter.setRowLayoutId(list_card_layout_resourceID);
}
//--------------------------------------------------------------------------
// Expand and Collapse animator
// Don't use this animator in a grid.
// All cells in the same row should expand/collapse a hidden area of same dimensions.
//--------------------------------------------------------------------------
@Override
public void onExpandStart(CardViewWrapper viewCard,View expandingLayout) {
//do nothing. Don't use this kind of animation in a grid
Log.w(TAG,"Don't use this kind of animation in a grid");
}
@Override
public void onCollapseStart(CardViewWrapper viewCard,View expandingLayout) {
//do nothing. Don't use this kind of animation in a grid
Log.w(TAG,"Don't use this kind of animation in a grid");
}
}