最终效果

表格布局

垂直布局

横向布局

添加引用

build.gradle

    implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.android.support:palette-v7:28.0.0'

主布局,添加一个RecyclerView

layout/activity_recyclerview.xml

  <android.support.v7.widget.RecyclerView
android:id="@+id/demo_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>

item子布局,使用CardView卡片式布局

layout/item_recyclerview.xml

<?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:layout_width="160dp"
android:layout_height="200dp"
android:layout_gravity="center"
app:cardBackgroundColor="@android:color/white"
app:cardCornerRadius="5dp"
app:cardElevation="2dp"
app:cardMaxElevation="@dimen/cardview_default_elevation"> <!--cardBackgroundColor:卡片的背景颜色-->
<!--cardCornerRadius:卡片的圆角半径-->
<!--cardElevation:卡片阴影的宽度-->
<!--cardMaxElevation:最大卡片阴影的宽度--> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <ImageView
android:id="@+id/item_image"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3"
android:scaleType="fitXY"/> <TextView
android:id="@+id/item_title"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:clickable="true"
android:gravity="center"
android:padding="5dp"
android:textColor="@android:color/black"
android:textSize="16dp"/>
</LinearLayout> </android.support.v7.widget.CardView>

为每一个卡片定义一个类

Item.java

public class Item {
private String title;//图片的名字
private int resId;//图片的资源Id
public Item(String title, int resId) {
this.title = title;
this.resId = resId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getResId() {
return resId;
}
public void setResId(int resId) {
this.resId = resId;
}
}

RecyclerView的适配器,使用Palette调色板提取颜色

RecyclerAdapter.java

imimport android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List; public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> { private Context context;
private List<Item> itemList;
private Resources resources;
private LayoutInflater inflater; public RecyclerAdapter(Context context, List<Item> itemList) {
this.context = context;
this.itemList = itemList;
this.resources = context.getResources();
//加载布局管理器,从一个Context中获得一个布局填充器
inflater = LayoutInflater.from(context);
} @NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int v) {
//将xml布局转换为View对象
View view = inflater.inflate(R.layout.item_recyclerview, parent, false);
//RecycleView的点击事件
final MyViewHolder holder=new MyViewHolder(view);
holder.image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int pos=holder.getAdapterPosition();
Item item=itemList.get(pos);
Toast.makeText(view.getContext(),"you clicked image "+item.getTitle(),Toast.LENGTH_SHORT).show();
}
});
return holder;
} @Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
final Item item = itemList.get(position);
holder.title.setText(item.getTitle());
holder.image.setImageResource(item.getResId());
Bitmap bitmap = BitmapFactory.decodeResource(resources, item.getResId());
//异步获得bitmap图片颜色值
Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(@Nullable Palette palette) {
//Palette提取颜色
Palette.Swatch vibrant=palette.getVibrantSwatch();//有活力
Palette.Swatch c=palette.getDarkVibrantSwatch();//有活力、暗色
Palette.Swatch d=palette.getLightVibrantSwatch();//有活力、亮色
Palette.Swatch f=palette.getMutedSwatch();//柔和
Palette.Swatch a=palette.getDarkMutedSwatch();//柔和、暗色
Palette.Swatch b=palette.getLightMutedSwatch();//柔和、亮色
if(vibrant!=null )
{
int color1=vibrant.getBodyTextColor();//内容颜色
int color2=vibrant.getTitleTextColor();//标题颜色
int color3=vibrant.getRgb();//RGB颜色
if(position<4)
{
holder.title.setBackgroundColor(f.getRgb());
holder.title.setTextColor(f.getTitleTextColor());
}
else
{
holder.title.setBackgroundColor(vibrant.getRgb());
holder.title.setTextColor(vibrant.getTitleTextColor());
}
}
}
});
} @Override
public int getItemCount() {
return null==itemList?0:itemList.size();
} public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView title;
public ImageView image; public MyViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.item_title);
image = itemView.findViewById(R.id.item_image);
}
}
}

实际应用

RecyclerViewActivity.java

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.LinearLayout; import java.util.ArrayList;
import java.util.List; /**
* RecycleView、CardView、Palette控件应用
*/
public class RecyclerViewActivity extends AppCompatActivity { private RecyclerView mRecyclerView;
private RecyclerAdapter mRecyclerAdapter;
private List<Item> viewData = new ArrayList<>();//图片列表 @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recyclerview);
loadDatas();
initViews();
} private void loadDatas() {
viewData.add(new Item("第1张图", R.mipmap.item1));
viewData.add(new Item("第2张图", R.mipmap.item2));
viewData.add(new Item("第3张图", R.mipmap.item3));
viewData.add(new Item("第4张图", R.mipmap.item4));
viewData.add(new Item("第5张图", R.mipmap.item5));
viewData.add(new Item("第6张图", R.mipmap.item6));
viewData.add(new Item("第7张图", R.mipmap.item7));
} private void initViews() {
mRecyclerView = findViewById(R.id.demo_recyclerview); //第一种设置布局方式:使用表格,显示3列
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3)); //第二种设置布局方式:默认使用垂直方式(纵向滚动)
//mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); //第三种设置布局方式:横向滚动
//LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
//linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
//mRecyclerView.setLayoutManager(linearLayoutManager); //设置添加删除Item时的动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//初始化设置配
mRecyclerAdapter = new RecyclerAdapter(this, viewData);
//设置适配器
mRecyclerView.setAdapter(mRecyclerAdapter);
}
}

Android控件_RecycleView+CarView+Palette联合应用的更多相关文章

  1. [Android Pro] android控件ListView顶部或者底部也显示分割线

    reference to  :  http://blog.csdn.net/lovexieyuan520/article/details/50846569 在默认的Android控件ListView在 ...

  2. Android控件Gridview实现仿支付宝首页,Fragment底部按钮切换和登录圆形头像

    此案例主要讲的是Android控件Gridview(九宫格)完美实现仿支付宝首页,包含添加和删除功能:Fragment底部按钮切换的效果,包含四个模块,登录页面圆形头像等,一个小项目的初始布局. 效果 ...

  3. Android 控件架构及View、ViewGroup的测量

    附录:示例代码地址 控件在Android开发的过程中是必不可少的,无论是我们在使用系统控件还是自定义的控件.下面我们将讲解一下Android的控件架构,以及如何实现自定义控件. 1.Android控件 ...

  4. Android - 控件android:ems属性

    Android - 控件android:ems属性http://blog.csdn.net/caroline_wendy/article/details/41684255?utm_source=tui ...

  5. Android 控件知识点,

    一.Android控件具有visibility属性,可以取三个值:visible(默认值)可见,invisible(不可见,但仍然占据原有的位置和大小,可以看做是变得透明了),gone(空间不仅不可见 ...

  6. UIAutomator定位Android控件的方法

    UIAutomator各种控件定位的方法. 1. 背景 使用SDK自带的NotePad应用,尝试去获得在NotesList那个Activity里的Menu Options上面的那个Add note菜单 ...

  7. 从Android系统出发,分析Android控件构架

    从Android系统出发,分析Android控件构架 Android中所有的控件追溯到根源,就是View 和ViewGroup,相信这个大家都知道,但是大家也许会不太清楚它们之间的具体关系是什么,在A ...

  8. Android控件系列之RadioButton&RadioGroup(转)

    学习目的: 1.掌握在Android中如何建立RadioGroup和RadioButton 2.掌握RadioGroup的常用属性 3.理解RadioButton和CheckBox的区别 4.掌握Ra ...

  9. 第三个 android控件

    android控件以及控件对应的属性:

随机推荐

  1. Zabbix的history相关数据表数据太大,执行表分区操作过程

    一.查询zabbix数据库大小 mysql> select table_schema, concat(truncate(sum(data_length)/1024/1024,2),' mb') ...

  2. HashMap集合排序方法

    首先我们先来看看Map集合获取元素的三种常见方法(1)entrySet(),(2)keySet(),(3)values() 1. entrySet():(1)先返回map集合的所有"映射&q ...

  3. Lucene 全文检索

    基于 lucene 8 1 Lucene简介 Lucene是apache下的一个开源的全文检索引擎工具包. 1.1 全文检索(Full-text Search) 全文检索就是先分词创建索引,再执行搜索 ...

  4. CodeBlocks 配置

    CodeBlocks 配置 Code::Blocks 17.12 时间:2019.6 下载网址 http://www.codeblocks.org/downloads/26 ,这里选择的是 mingw ...

  5. (十四)mybatis 和 spring 整合

    目录 整合思想 整合步骤 整合之后原始 dao 开发 整合之后 Mapper 代理开发 总结 整合思想 让 spring 管理 sqlSessionFactory ,使用 单例模式 创建该对象 : 根 ...

  6. 洛谷P2659 美丽的序列 单调栈模板

    P2659 美丽的序列 题目链接 https://www.luogu.org/problemnew/show/P2659 题目描述 为了研究这个序列的美丽程度,GD定义了一个序列的"美丽度& ...

  7. DP单调队列--斜率优化P3195

    题意:https://www.luogu.com.cn/problem/P3195 思路:https://www.luogu.com.cn/problemnew/solution/P3195 #def ...

  8. NameValuePair 简单名称值对节点类型

    /// <summary> /// 组装普通文本请求参数用于post请求 /// </summary> /// <param name="parameters& ...

  9. 【php设计模式】门面模式

    门面模式又叫外观模式,用来隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及到一个单一的类 ...

  10. HTML的标签简单概括

    段落标签 <p></p> 属性  说明 值 align 对其方式 left(默认).right.center 水平线 <hr /> 属性  说明   值 width ...