RecyclerView一个可以代替ListView和GridView的控件,那么RecyclerView到底比他们好在哪里?
RecyclerView架构提供了一种插拔式的体验,所以实现了代码的高度解耦,使用起来也异常的灵活。
我们可以通过设置它的LayoutManager控制其显示的方式,通过ItemDecoration控制Item间的间隔,通过ItemAnimator控制Item的增删动画
RecyclerView.LayoutManager提供了三个实现类其中LinearLayoutManager 现行管理器,支持横向、纵向,GridLayoutManager 网格布局管理器,StaggeredGridLayoutManager 瀑布就式布局管理器
那么先从LinearLayoutManager看起
先在gradle中引用倚赖:compile ‘com.android.support:recyclerview-v7:23.4.0’
1:朱布局,放入reclyerview
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="study.bawei.com.recyclerview.activity.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_editor_absoluteY="8dp"
tools:layout_editor_absoluteX="8dp"></android.support.v7.widget.RecyclerView>
</LinearLayout>
2:item的布局,放入图片
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
3:主activity,添加数据源,item适配器package study.bawei.com.recyclerview.activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import java.util.ArrayList;
import study.bawei.com.recyclerview.R;
import study.bawei.com.recyclerview.adapter.MyAda;
public class MainActivity extends AppCompatActivity {
String str="http://img2.imgtn.bdimg.com/it/u=885222770,3335807376&fm=11&gp=0.jpg";
private RecyclerView rv;
private ArrayList<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv= (RecyclerView) findViewById(R.id.rv);
list=new ArrayList<>();
//view的数据源
for (int i=0;i<10;i++){
list.add(str);
}
//核心代码
//声明瀑布流的布局方式,3列垂直
StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
//设置管理器
rv.setLayoutManager(manager);
//创建适配器
MyAda ada = new MyAda(list, this);
/*//设置添加,移除item的动画,DefaultItemAnimator为默认的
rv.setItemAnimator(new DefaultItemAnimator());*/
rv.setAdapter(ada);
}
}
4:item适配器
package study.bawei.com.recyclerview.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 com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.Random;
import study.bawei.com.recyclerview.R;
/**
* 1:类的用途
* 2:@author 张倩
* 3:@date 2017/9/3 18:50
*/
public class MyAda extends RecyclerView.Adapter{
ArrayList<String> list;
Context con;
private View view;
private ArrayList<Integer> heightList;//装产出的随机数
public MyAda(ArrayList<String> list, Context con) {
this.list = list;
this.con = con;
//随机数决定高度
heightList=new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
int height = new Random().nextInt(200) + 100;//[100,300)的随机数
heightList.add(height);
}
}
//方法
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//找到item的布局
view = LayoutInflater.from(con).inflate(R.layout.item, parent,false);
//将item布局给寄存器
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ViewHolder holder1 = new ViewHolder(view);
/* holder1.tv.setText(list.get(position));
ViewGroup.LayoutParams params = holder1.tv.getLayoutParams();
params.height=heightList.get(position);
holder1.tv.setLayoutParams(params);*/
//图片框架
DisplayImageOptions options = new DisplayImageOptions.Builder().showImageOnLoading(R.mipmap.q).build();
ImageLoader.getInstance().displayImage(list.get(position),holder1.iv,options);
由于需要实现瀑布流的效果,所以就需要动态的改变控件的高度了
ViewGroup.LayoutParams params = holder1.iv.getLayoutParams();
params.height=heightList.get(position);
holder1.iv.setLayoutParams(params);
}
//数据源的count
@Override
public int getItemCount() {
return list.size();
}
//寄存器
public class ViewHolder extends RecyclerView.ViewHolder{
// TextView tv;
ImageView iv;
public ViewHolder(View itemView) {
super(itemView);
// tv= (TextView) itemView.findViewById(R.id.tv);
iv= (ImageView) itemView.findViewById(R.id.iv);
}
}
}