RecylerView实现流布局StaggeredGridLayoutManager使用详解

本文实例为大家分享了RecylerView实现流布局的具体代码,供大家参考,具体内容如下

第一步:添加依赖

compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:design:25.3.1'
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'
compile 'com.github.bumptech.glide:glide:3.7.0'

因为加载的是网络图片,所以采用的是Glide图片加载框架。

第二步:recylerview布局 (刷新需要添加SwipeRefreshLayout)

<?xml version="1.0" encoding="utf-8"?>
<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.example.wangchang.testpalette.MainActivity">

 <android.support.v7.widget.RecyclerView
  android:id="@+id/recylerview"
  android:padding="4dp"
  android:layout_width="match_parent"
  android:layout_height="match_parent" />
</RelativeLayout>

第三步:RecylerView初始化

 recyclerView = (RecyclerView) findViewById(R.id.recylerview);

 recyclerView.setHasFixedSize(true);
 recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
  recyclerView.setAdapter(adapter = new DemoAdapter());
  adapter.replaceAll(getData());

Demo中:

final StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2,
    StaggeredGridLayoutManager.VERTICAL);
  mRecyclerView.setLayoutManager(layoutManager);
  mMeizhiListAdapter = new MeizhiListAdapter(getContext(), mMeizhiList);
  mRecyclerView.setAdapter(mMeizhiListAdapter);
  mRecyclerView.addOnScrollListener(getOnBottomListener(layoutManager));//滚动预先加载数据
  mMeizhiListAdapter.setOnMeizhiTouchListener(getOnMeizhiTouchListener());//点击事件

这里主要是 recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); 设置StaggeredGridLayoutManager布局管理器,参数分别是列数,方向。

第四步:适配器的实现

package com.hsy.utils.utilsdemo.adapter;

import android.content.Context;
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 com.hsy.utils.utilsdemo.R;
import com.hsy.utils.utilsdemo.module.home.Daily;
import com.hsy.utils.utilslibrary.utils.GlideUtils;

import java.util.List;

/**
 * Created by drakeet on 6/20/15.
 */
public class MeizhiListAdapter
  extends RecyclerView.Adapter<MeizhiListAdapter.ViewHolder> {

 public static final String TAG = "MeizhiListAdapter";

 private List<Daily> mList;
 private Context mContext;
 private OnMeizhiTouchListener mOnMeizhiTouchListener;

 public MeizhiListAdapter(Context context, List<Daily> meizhiList) {
  mList = meizhiList;
  mContext = context;
 }

 @Override
 public ViewHolder onCreateViewHolder(ViewGroup parent, int i) {
  View v = LayoutInflater.from(parent.getContext())
    .inflate(R.layout.item_meizhi, parent, false);
  return new ViewHolder(v);
 }

 @Override
 public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
  Daily meizhi = mList.get(position);
  int limit = 48;
  String text = "";
  if (meizhi != null && meizhi.getTitle() != null) {
   text = meizhi.getTitle().length() > limit ? meizhi.getTitle().substring(0, limit) +
     "..." : meizhi.getTitle();
  }
  viewHolder.meizhi = meizhi;
  viewHolder.titleView.setText(text);
  viewHolder.card.setTag(meizhi.getDesc());

//加载图片
  GlideUtils.displayImage(mContext, meizhi.getImgUrl(), viewHolder.meizhiView);

 }

 @Override
 public void onViewRecycled(ViewHolder holder) {
  super.onViewRecycled(holder);
 }

 @Override
 public int getItemCount() {
  return mList != null ? mList.size() : 0;
 }

 public void setOnMeizhiTouchListener(OnMeizhiTouchListener onMeizhiTouchListener) {
  this.mOnMeizhiTouchListener = onMeizhiTouchListener;
 }

 class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

  ImageView meizhiView;
  TextView titleView;
  View card;
  Daily meizhi;

  public ViewHolder(View itemView) {
   super(itemView);
   card = itemView;
   meizhiView = (ImageView) itemView.findViewById(R.id.meizhi);
   titleView = (TextView) itemView.findViewById(R.id.title);
   meizhiView.setOnClickListener(this);
   card.setOnClickListener(this);
   itemView.setOnClickListener(this);
  }

  @Override
  public void onClick(View v) {
   mOnMeizhiTouchListener.onTouch(v, meizhiView, card, meizhi);
  }
 }
}

每个布局的样式item_layout

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_marginLeft="5dp"
 android:layout_marginRight="5dp"
 android:layout_marginTop="5dp">

 <LinearLayout
  android:id="@+id/meizhi_card"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:clickable="true"
  android:orientation="vertical">
  <!-- android:background="@drawable/bg_card"-->
  <ImageView
   android:id="@+id/meizhi"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:adjustViewBounds="true"
   android:scaleType="fitXY" />

  <LinearLayout
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="?attr/selectableItemBackground"
   android:orientation="horizontal"
   android:paddingBottom="10dp"
   android:paddingLeft="10dp"
   android:paddingRight="10dp"
   android:paddingTop="10dp">

   <TextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceSmall"
    tools:text="Title" />

  </LinearLayout>

 </LinearLayout>
</android.support.v7.widget.CardView>

下面来说实现动态设置图片大小方式

ivImage.getContext()).getWindowManager().getDefaultDisplay().getWidth();
  ViewGroup.LayoutParams params = ivImage.getLayoutParams();
  //设置图片的相对于屏幕的宽高比
  params.width = width/3;
  params.height = (int) (200 + Math.random() * 400) ;
  ivImage.setLayoutParams(params);

这里是获取屏幕宽度,因为是三列,所以设置图片宽度取屏幕三分之一。

demo源码:参考UtilsDemo中的消息

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android中UIColletionView瀑布流布局实现思路以及封装的实现

    瀑布流实现思路 第一种就是用ScrollView来进行实现,由于它不具备复用的功能,因此我们需要自己写一套类似复用的模块来进行优化 第二种就是利用apple做好的复用模块,自定义UIColletionLayout来实现瀑布流,想想也是第二种实现起来更快更优,OK,封装一个小小的框架来试试 默认两列 其他案例 上面的动画切换布局也是自定义UICollectionLayout来进行布局的,简单的静态图片布局展示其实就重写几个方法就可以了 1.prepareLayout 每次重新刷新collectio

  • RecylerView实现流布局StaggeredGridLayoutManager使用详解

    本文实例为大家分享了RecylerView实现流布局的具体代码,供大家参考,具体内容如下 第一步:添加依赖 compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support:design:25.3.1' compile 'com.android.support:recyclerview-v7:25.3.1' compile 'com.android.support:cardview-v7:25.3.1'

  • javascript瀑布流布局实现方法详解

    本文实例讲述了javascript瀑布流布局实现方法.分享给大家供大家参考,具体如下: html结构: <div id="waterfall"> <div class="mod-box"> <div class="mod-img">...</div> </div> <div class="mod-box"> <div class="mod-

  • jQuery Masonry瀑布流布局神器使用详解

    最近在做个网站时,其中有一部分涉及到很多图片布局,想采用比较流行的Water Flow布局. 开始的时候自己动手写的,真费事情,没有考虑检测图片大小,虽然也能达到布局效果,但是图片有的本身尺寸比较小却被强行拉大了,看起来很不和谐.后来上网收了一下,原来有很好的Water Flow布局工具使用.下面来认识一下这个神器吧~ 神器名称:JQuery Masonry , 网址:http://masonry.desandro.com/index.html 使用方法相当简单: 1.标记需要布局的容器和Ite

  • JavaScript实现瀑布流布局详解

    目录 需求 思路 代码实现 实现效果 问题和修正 修正后效果 总结 需求 所谓瀑布流布局,就是含有若干个等宽的列,每一列分别放置图片.视频等,放置的元素都是等宽的,因此可能是不等高的.新的元素到来时,会插入高度较低的那一列,这样形成参差的.视觉上像瀑布一样的布局. 这里简化一下,只要两列等宽布局展示图片即可. 思路 两列布局,直接使用flex布局实现即可.不过,这里不能设置align-items为center,如果设置了将会使图片列居中显示,不符合瀑布流的视觉效果.我设置left和right两列

  • 详解Flutter混排瀑布流解决方案

    背景 流式布局,这是一种当前无论是前端,还是Native都比较流行的一种页面布局.特别是对于商品这样的Feeds流,无论是淘宝,京东,美团,还是闲鱼.都基本上以多列瀑布流进行呈现,容器列数固定,然后每个卡片高度不一,形成参差不齐的多栏布局. 对于Native来说,无论是iOS还是Android,CollectionView和RecyclerView都能满足我们的绝大部分场景了.不过目前闲鱼很多业务场景都是在Flutter上进行实现的,当时Flutter官方只提供了ListView和GridVie

  • 将替代ListView的RecyclerView 的使用详解(一)

    RecyclerView 是 android-support-v7-21 版本中新增的一个 Widgets, 还有一个 CardView 会在下次介绍使用.官方介绍 RecyclerView 是 ListView 的升级版本,更加先进和灵活.我们写一个简单的实例例,来看一下究竟有多先进和灵活. build.gradle 配置 android { compileSdkVersion 'android-L' buildToolsVersion "20.0.0" defaultConfig

  • Android CoordinatorLayout详解及实例代码

    Android CoordinatorLayout详解 一.CoordinatorLayout有什么作用 CoordinatorLayout作为"super-powered FrameLayout"基本实现两个功能: 1.作为顶层布局 2.调度协调子布局 CoordinatorLayout使用新的思路通过协调调度子布局的形式实现触摸影响布局的形式产生动画效果.CoordinatorLayout通过设置子View的 Behaviors来调度子View.系统(Support V7)提供了A

  • Android RecyclerView详解之实现 ListView GridView瀑布流效果

     什么是RecyclerView RecyclerView 是Google推出的最新的 替代ListView.GridView的组件,RecyclerView是用来显示大量数据的容器,并通过有限数量的子View,来提高滚动时的性能. 与ListView不同,RecyclerView 不再负责布局,而是专注于布局复用.布局主要通过 LayoutManager来管理,目前提供了3种常用的布局管理: LinearLayoutManager 线性布局管理器 (ListView效果) GridLayout

  • Android RecyclerView添加头部和底部实例详解

    Android RecyclerView添加头部和底部实例详解 如果只是想添加头部,可是使用GitHub里面这个项目,它可以为LinearLayoutManager,GridLayoutManager ,StaggeredGridLayoutManager布局的RecyclerView添加header.使用起来也十分简单: 只需将RecyclerViewHeader布局放在RecyclerView的上层. <FrameLayout android:layout_width="match_p

  • RecyclerView使用详解(代替ListView)

    老规矩,先看效果: Recycler是android5.0版本中新添加的一个view; 使用之前必须添加依赖库: dependencies { compile 'com.android.support:recyclerview-v7:23.0.+' } 这里我就不再过多的介绍RecyclerView,既然大家在找使用RecyclerView的demo想必大家都了解过了,如果不了解网上随便打开一篇RecyclerView的文章应该都有,已经烂大街,在此就不过多的重复了: 今天写的demo主要是利用

随机推荐