澳门新葡亰娱乐网站-www.142net-欢迎您

澳门新葡亰娱乐网站是因为你还没有找到一条正确的致富之路,www.142net是将所有的游戏都汇集在一起的官方平台,因为澳门新葡亰娱乐网站这个网站当中有着大量的游戏攻略,托IP定位技术,传达终端直接到达的精准传播方式。

Android手把手教你实现卡片式瀑布流效果,CardVi

来源:http://www.bhtsgq.com 作者:计算机知识 人气:95 发布时间:2020-03-14
摘要:卡片式的瀑布流效果是一种相当美观的UI设计,自从Android 5.0的RecyclerView现身之后,达成瀑布流变得不行简便,本文将一步步指引读者去完毕一个卡片式的瀑布流结构。 首先记录一下前

卡片式的瀑布流效果是一种相当美观的UI设计,自从Android 5.0的 RecyclerView现身之后,达成瀑布流变得不行简便,本文将一步步指引读者去完毕一个卡片式的瀑布流结构。

首先记录一下前几天的五个好消息,看下图

Demo:https://github.com/HunSem/RecycleViewAndCardView

先上海体育场合吧,哈哈:

一、先上效果图

源码上传在git上上,下载达成后一向用Android Studio打开就能够

图片 1image

图片 2村办Wechat大伙儿号原创通告.jpg证实:历时不满40天时间开展了原创功用,在当时期所发文章都是原创,逢星期日二日都未有发过文。后天想都没悟出清晨给了本身开通原创布告。好欢愉!比方陈赞等效果还未有曾开展,期望中,小编的稿子都在群众号首发,敬请关心

骨子里本身很好

- 关于RecyclerView强大的功能不再赘述,这里主要讲述将CardView作为RecyclerView的item,并实现瀑布流布局方法。

![瀑布流布局.png](http://upload-images.jianshu.io/upload_images/1996273-c7cd04e9c6683357.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)


######1. 新建list_item.xml文件,用于规划一个item,也就是一个CardView的布局

<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<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="match_parent"
android:layout_height="wrap_content"
Android手把手教你实现卡片式瀑布流效果,CardView实现双向的瀑布流。app:cardBackgroundColor="@android:color/white"
app:cardCornerRadius="5dp"
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
android:layout_margin="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="6dp"
android:layout_marginRight="10dp"
android:layout_gravity="center_vertical"
android:orientation="vertical">
<ImageView
android:layout_gravity="center_horizontal"
android:id="@ id/face"
android:layout_width="70dp"
android:layout_height="70dp"
android:adjustViewBounds="true"
android:scaleType="centerCrop"/>
<TextView
android:id="@ id/item_title_tv"
android:layout_width="wrap_content"
android:textColor="#383838"
android:textSize="20sp"
android:textStyle="bold"
android:layout_height="wrap_content"
android:text="title"/>
<TextView
android:id="@ id/item_content_tv"
android:textColor="#545454"
android:textSize="16sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="哈哈哈哈哈"/>
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>

>tip 1: 如上图代码所示,在CardView的外层包裹了一层LinearLayout,并设置其属性android:layout_margin="5dp",表示每个item之间的间隔。如果不这样做的话在运行时,每个item之间是没有间隔,全部连在一起的。

>tip 2: 为了实现瀑布流的布局,CardView的Width(宽度)固定使用match_parent,height(高度)随内容而改变使用使用wrap_content。

######2. 在主布局文件中声明RecyclerView

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.huan.percy.recycleviewandcardview.MainActivity"
<android.support.v7.widget.RecyclerView
android:id="@ id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>

######3. 创建自定义适配器MyAdapter
为了后期在实现数据上拉加载更多,便于定位,下来刷新便于固定当前位置,采用链表结构在存储数据,便于直接在头节点处添加数据项。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private LinkedList<Map<String, Object>> list;
public MyAdapter(LinkedList<Map<String, Object>> list) {
this.list = list;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = View.inflate(viewGroup.getContext(), R.layout.list_item, null);
return new ViewHolder(view);
}
//在控件中绑定数据
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
viewHolder.title_tv.setText(list.get(i).get("title").toString());
viewHolder.content_tv.setText(list.get(i).get("content").toString());
viewHolder.face.setImageResource((int)list.get(i).get("face"));
}
@Override
public int getItemCount() { return list.size(); }
//将控件与ViewHolder举办绑定
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView title_tv;
public TextView content_tv;
public ImageView face;
public ViewHolder(View itemView) {
super(itemView);
title_tv = (TextView) itemView.findViewById(R.id.item_title_tv);
content_tv = (TextView)
itemView.findViewById(R.id.item_content_tv);
face = (ImageView) itemView.findViewById(R.id.face);
}
}
}

######4. MainActivity中模拟数据

public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
//用于保存数据
private LinkedList<Map<String, Object>> products = new LinkedList<Map<String, Object>>();
private String content = "哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈n"

  • "哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈n"
    "哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈n"
    "哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈n"
    "哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈n"
    "哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initVar();
    initView();
    }
    private void initView() {
    recyclerView= (RecyclerView) findViewById(R.id.recyclerView);
    //设置并列2行的layoutManager,达成瀑布流构造
    recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
    //设置线性构造的layoutManager
    //LinearLayoutManager linearLayoutManager = new
    LinearLayoutManager(this);
    //recyclerView.setLayoutManager(linearLayoutManager);
    //设置adapter
    MyAdapter adapter=new MyAdapter(products);
    recyclerView.setAdapter(adapter);
    }
    //新建一些数量
    private void initVar() {
    for (int i = 0; i<20; i ){
    Map<String, Object> listItem = new HashMap<String, Object>();
    if (i % 2 == 0){
    listItem.put("title", "title" i);
    listItem.put("content", content i);
    } else {
    listItem.put("title", "title " i);
    listItem.put("content", "content" i);
    }
    listItem.put("face", R.drawable.heroes_16);
    products.add(listItem);
    }
    }
    }

图片 3

二、代码达成卡牌式瀑布流

类或控件 介绍 作用
RecyclerView 5.0出现的类似于ListView的控件 用它的布局管理器实现两列“ListView”效果
StaggeredGridLayoutManager 交错布局管理器 实现两列“ListView”效果
RecyclerView.Adapter 数据适配器 与ListView的Adapter类似,写法上不同。
CardView 同样是5.0新出的控件 实现圆角效果,省去了自己写Drawble,这个可要可不要。
Fresco 图片开源框架 为了简化从网上下载图片的过程就使用了它做快速演示,如想了解Fresco的详情,请看本人另一篇博客:Fresco图片框架简介及使用
compile 'com.android.support:recyclerview-v7:24.2.0'compile 'com.facebook.fresco:fresco:0.14.1'compile 'com.android.support:cardview-v7:25.0.0'

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:andro xmlns:tools="http://schemas.android.com/tools" android: android:layout_width="match_parent" android:layout_height="match_parent" android:background="#F0F0F0" tools:context="com.testwaterfall.MainActivity" > <android.support.v7.widget.RecyclerView android: android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="none" ></android.support.v7.widget.RecyclerView></RelativeLayout>

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" android:background="#F0F0F0" android:orientation="vertical" android:padding="5dp" > <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#FFFFFF" app:cardCornerRadius="5dp" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="5dp" android:paddingLeft="6dp" android:paddingRight="6dp" android:paddingTop="10dp" android:orientation="vertical" > <com.facebook.drawee.view.SimpleDraweeView android: android:layout_width="match_parent" android:layout_height="wrap_content" fresco:actualImageScaleType="centerCrop" /> <TextView android: android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" /> </LinearLayout> </android.support.v7.widget.CardView></LinearLayout>

public class WaterFallAdapter extends RecyclerView.Adapter { private Context mContext; private List<PersonCard> mData; //定义数据源 //定义构造方法,默认传入上下文和数据源 public WaterFallAdapter(Context context, List<PersonCard> data) { mContext = context; mData = data; } @Override //将ItemView渲染进来,创建ViewHolder public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from.inflate(R.layout.recyclerview_item, null); return new MyViewHolder; } @Override //将数据源的数据绑定到相应控件上 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { MyViewHolder holder2 = (MyViewHolder) holder; PersonCard personCard = mData.get; Uri uri = Uri.parse(personCard.avatarUrl); holder2.userAvatar.setImageURI; holder2.userAvatar.getLayoutParams().height = personCard.imgHeight; //从数据源中获取图片高度,动态设置到控件上 holder2.userName.setText(personCard.name); } @Override public int getItemCount() { if (mData != null) { return mData.size(); } return 0; } //定义自己的ViewHolder,将View的控件引用在成员变量上 public class MyViewHolder extends RecyclerView.ViewHolder { public SimpleDraweeView userAvatar; public TextView userName; public MyViewHolder(View itemView) { super; userAvatar = (SimpleDraweeView) itemView.findViewById(R.id.user_avatar); userName =  itemView.findViewById(R.id.user_name); } }}

public class PersonCard implements Serializable{ public String avatarUrl; //明显头像的Url public String name; //明显的名字 public int imgHeight; //头像图片的高度}

public class MainActivity extends Activity { private RecyclerView mRecyclerView; private RecyclerView.LayoutManager mLayoutManager; private WaterFallAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview); //设置布局管理器为2列,纵向 mLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); mAdapter = new WaterFallAdapter(this, buildData; mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setAdapter; } //生成6个明星数据,这些Url地址都来源于网络 private List<PersonCard> buildData() { String[] names = {"邓紫棋","范冰冰","杨幂","Angelababy","唐嫣","柳岩"}; String[] imgUrs = {"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1477122728&di=21924aeef8f7847a651fc8bf00a28f49&src=http://www.tengtv.com/file/upload/201609/18/232836341.jpg", "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1477122795&di=f740bd484870f9bcb0cafe454a6465a2&src=http://www.bhtsgq.com/uploads/allimg/200314/012I63H1-4.jpg", "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=673651839,1464649612&fm=111&gp=0.jpg", "https://ss0.baidu.com/94o3dSag_xI4khGko9WTAnF6hhy/image/h=200/sign=fd90a83e900a304e4d22a7fae1c9a7c3/d01373f082025aafa480a2f1fcedab64034f1a5d.jpg", "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1849074283,1272897972&fm=111&gp=0.jpg", "https://ss0.baidu.com/-Po3dSag_xI4khGko9WTAnF6hhy/image/h=200/sign=005560fc8b5494ee982208191df4e0e1/c2fdfc039245d68827b453e7a3c27d1ed21b243b.jpg", }; List<PersonCard> list = new ArrayList<>(); for(int i=0;i<6;i  ) { PersonCard p = new PersonCard(); p.avatarUrl = imgUrs[i]; p.name = names[i]; p.imgHeight = *100   400; //偶数和奇数的图片设置不同的高度,以到达错开的目的 list.add; } return list; }}

进去正题:明天发的一篇《Android5.0竖向瀑布流RecyclerView CardView》关于选取RecyclerView完毕竖向瀑布流效果,明天给大家介绍横向的功能,并贯彻回调监听。

shot-img.jpg

三、总结


一、效果图:

达成思路:
RecyclerView 中提供的 StaggeredGridLayoutManager 交叉网格的结构管理来促成网格的功能,然后经过任性的支配个中item的中度来安装。

图片 4recyclerview双向瀑布流.gif

第一代码:

本文由澳门新葡亰发布于计算机知识,转载请注明出处:Android手把手教你实现卡片式瀑布流效果,CardVi

关键词: 源码 瀑布 手把手教你 双向 RecyclerView

最火资讯