所須要的庫及庫工程java
庫:android
android-support-v7-recyclerview.jar :v21.xapp
android-support-v4.jar :v21.xide
庫工程:工具
android-support-v7-appcompat:v21.x佈局
android-support-v7-cardview動畫
注意:cardView必須使用庫工程,而不能使用jar包,緣由是其引用了自定義屬性ui
可是,若是必需要使用cardView而不導入工程,建議使用cardview源碼,主要步驟以下:this
①將自定義attr,color,dimens,styles拷貝至工程目錄下spa
②修改源碼中的 import android.support.v7.cardview.R; 成當前工程的R資源
③認真完成以上2步驟
效果預覽
Activity文件
package st.app.base.rcp; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.support.v7.internal.view.menu.MenuBuilder; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class WaterfallActivity extends ActionBarActivity { private Toolbar mToolbar; private RecyclerView mRecyclerView; private List<String> mDatas = null; private SimpleRecyclerCardAdapter mSimpleRecyclerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mToolbar = (Toolbar) findViewById(R.id.toolbar); mRecyclerView = (RecyclerView) findViewById(R.id.app_recyclerview); initAppToolBar(); initDataAndView(); } private void initDataAndView() { mDatas = new ArrayList<String>(); for(int i='A';i<='z';i++) { mDatas.add(String.valueOf((char)i)); } mSimpleRecyclerAdapter = new SimpleRecyclerCardAdapter(this, mDatas); mRecyclerView.setAdapter(mSimpleRecyclerAdapter); //設置網格佈局管理器 mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)); mSimpleRecyclerAdapter.setOnItemActionListener(new SimpleRecyclerCardAdapter.OnItemActionListener() { @Override public boolean onItemLongClickListener(View v, int pos) { Toast.makeText(activity, "-長按-"+pos, Toast.LENGTH_SHORT).show(); return false; } @Override public void onItemClickListener(View v, int pos) { Toast.makeText(activity, "-單擊-"+pos, Toast.LENGTH_SHORT).show(); } }); } /** * init app bar */ private void initAppToolBar() { mToolbar.setNavigationIcon(R.drawable.ktv_ic_main_hot_pressed); mToolbar.setTitle("Rocko");// 標題的文字需在setSupportActionBar以前,否則會無效 mToolbar.inflateMenu(R.menu.main); setShortcutsVisible(mToolbar.getMenu()); mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_settings: break; case R.id.action_mail: break; case R.id.action_plus: break; default: break; } return true; } }); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e("Navigation", "Click"); } }); } private void setShortcutsVisible(Menu menu) { if(MenuBuilder.class.isInstance(menu)) { MenuBuilder builder = (MenuBuilder) menu; builder.setShortcutsVisible(true); try { Method m = menu.getClass().getDeclaredMethod( "setOptionalIconsVisible", Boolean.TYPE); m.setAccessible(true); m.invoke(builder, true); } catch (Exception ie) { } } } }
Adapter+ViewHolder
import java.util.ArrayList; import java.util.List; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; public class SimpleRecyclerCardAdapter extends RecyclerView.Adapter<SimpleCardViewHolder>{ private Context mCtx; private LayoutInflater mInflater; private final List<String> mDataSource = new ArrayList<String>(); private OnItemActionListener mOnItemActionListener; public SimpleRecyclerCardAdapter(Context mCtx, List<String> dataList) { super(); this.mCtx = mCtx; mInflater = LayoutInflater.from(mCtx); this.mDataSource.addAll(dataList); } @Override public int getItemCount() { return mDataSource.size(); } @Override public void onBindViewHolder(final SimpleCardViewHolder viewHolder, int i) { viewHolder.itemTv.setText(mDataSource.get(i)); int resId = mCtx.getResources().getIdentifier("img_"+i, "drawable", mCtx.getPackageName()); if(resId!=0) { viewHolder.itemIv.setImageResource(resId); } if(mOnItemActionListener!=null) { viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //注意這裏必須使用viewHolder.getPosition()而不能用i,由於爲了保證動畫,沒有使用NotifyDatasetChanged更新位置數據 mOnItemActionListener.onItemClickListener(v,viewHolder.getPosition()); } }); viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { //注意這裏必須使用viewHolder.getPosition()而不能用i,由於爲了保證動畫,沒有使用NotifyDatasetChanged更新位置數據 return mOnItemActionListener.onItemLongClickListener(v, viewHolder.getPosition()); } }); } } @Override public SimpleCardViewHolder onCreateViewHolder(ViewGroup viewgroup, int i) { View v = mInflater.inflate(R.layout.simple_card_item, viewgroup,false); SimpleCardViewHolder simpleViewHolder = new SimpleCardViewHolder(v); simpleViewHolder.setIsRecyclable(true); return simpleViewHolder; } /**********定義點擊事件**********/ public interface OnItemActionListener { public void onItemClickListener(View v,int pos); public boolean onItemLongClickListener(View v,int pos); } public void setOnItemActionListener(OnItemActionListener onItemActionListener) { this.mOnItemActionListener = onItemActionListener; } } class SimpleCardViewHolder extends ViewHolder { public TextView itemTv; public ImageView itemIv; public SimpleCardViewHolder(View layout) { super(layout); itemTv = (TextView) layout.findViewById(R.id.item_title); itemIv = (ImageView) layout.findViewById(R.id.item_img); } }
佈局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@android:color/white" tools:context="st.app.base.rcp.MainActivity" > <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/material_deep_teal_500" android:minHeight="?attr/actionBarSize" app:popupTheme="@style/AppBarTheme" app:theme="@style/ThemeOverlay.AppCompat.ActionBar" > </android.support.v7.widget.Toolbar> <android.support.v7.widget.RecyclerView android:id="@+id/app_recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
item佈局文件
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/cardview" android:layout_margin="0dp" android:layout_height="83dp" app:cardBackgroundColor="@android:color/white" app:cardCornerRadius="5dp" app:cardElevation="5dp" app:contentPadding="5dip" android:layout_width="match_parent" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/item_img" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:scaleType="fitCenter" /> <TextView android:id="@+id/item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/item_img" android:layout_centerHorizontal="true" android:textColor="@color/material_deep_teal_500" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" /> </RelativeLayout> </android.support.v7.widget.CardView>
主題樣式
AppBarBaseTheme
<style name="Theme.AppCompat.NoActionBar"> <item name="windowActionBar">false</item> <item name="android:windowNoTitle">true</item> </style>
styles
<style name="AppBarTheme" parent="ThemeOverlay.AppCompat.Light"> <item name="actionDropDownStyle">@style/AppBaseToolBarMenuDropDownStyle</item> <item name="actionOverflowMenuStyle">@style/AppBaseToolbarOverflowMenuStyle</item> <!--菜單顏色--> <item name="android:textColor">@android:color/white</item> <!--溢出菜單按鈕(ActionBar溢出菜單,即最後一個按鈕)--> <item name="actionOverflowButtonStyle">@style/AppBaseToolbarOverflowButtonStyle</item> </style> <style name="AppBaseToolBarMenuDropDownStyle" parent="@style/Base.Widget.AppCompat.Spinner.DropDown.ActionBar"> <item name="overlapAnchor">false</item> <item name="android:popupBackground">@color/material_deep_teal_500</item> <item name="android:dropDownHorizontalOffset">-4dip</item> </style> <style name="AppBaseToolbarOverflowMenuStyle" parent="@style/Widget.AppCompat.Light.PopupMenu.Overflow"> <item name="overlapAnchor">false</item> <item name="android:popupBackground">@color/material_deep_teal_500</item> <!--ActionBar Menu顏色--> <item name="android:textColorPrimary">@android:color/white</item> </style> <style name="AppBaseToolbarOverflowButtonStyle" parent="@style/Widget.AppCompat.Light.ActionButton.Overflow"> <item name="android:src">@drawable/abc_ic_menu_moreoverflow_mtrl_alpha</item> </style>
附加一點Palettel小知識,該工具用於位圖取色,使用環境爲換膚,換title,或者取色(取色能夠動態截圖的方式)
Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() { @Override public void onGenerated(Palette palette) { Palette.Swatch vibrant = palette.getVibrantSwatch(); if (vibrant != null) { int rgb = vibrant.getRgb(); int titleTextColor = vibrant.getTitleTextColor(); int bodyTextColor = vibrant.getBodyTextColor(); } } });