码迷,mamicode.com
首页 > 移动开发 > 详细

Android RecyclerView+CardView实现瀑布流效果

时间:2015-08-12 21:55:57      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

所需要的库及库工程

库:

android-support-v7-recyclerview.jar :v21.x

android-support-v4.jar :v21.x

库工程:

android-support-v7-appcompat:v21.x

android-support-v7-cardview


注意:cardView必须使用库工程,而不能使用jar包,原因是其引用了自定义属性

但是,如果必须要使用cardView而不导入工程,建议使用cardview源码,主要步骤如下

①将自定义attr,color,dimens,styles拷贝至工程目录下

②修改源码中的 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));
		
	}
	/**
	 * 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>(); 
	
	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(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);
		}
	}
	@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;
	}
}

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>


Android RecyclerView+CardView实现瀑布流效果

标签:

原文地址:http://my.oschina.net/ososchina/blog/491564

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!