一:介绍
RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好
RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集。RecyclerView用以下两种方式简化了数据的展示和处理:
-
使用LayoutManager来确定每一个item的排列方式。
-
为增加和删除项目提供默认的动画效果。
二:添加依赖包
RecyclerView依赖包
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
Glide加载图片
compile 'com.github.bumptech.glide:glide:3.7.0'
三:添加权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
四:布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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="activity.example.com.recycleview.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>
</RelativeLayout>
五:代码
1:MainActivity
package activity.example.com.recycleview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//或取id
recyclerview = (RecyclerView)findViewById(R.id.recyclerview);
//添加了一些假数据
List<ImageData> list = new ArrayList<>();
list.add(new ImageData(R.drawable.a,"1"));
list.add(new ImageData(R.drawable.a2,"2"));
list.add(new ImageData(R.drawable.a3,"3"));
list.add(new ImageData(R.drawable.a4,"4"));
list.add(new ImageData(R.drawable.a5,"5"));
list.add(new ImageData(R.drawable.a6,"6"));
list.add(new ImageData(R.drawable.a7,"7"));
list.add(new ImageData(R.drawable.a8,"8"));
list.add(new ImageData(R.drawable.a9,"9"));
list.add(new ImageData(R.drawable.a10,"10"));
// 线性布局管理器 VERTICAL默认样式/竖向显示 第三个参数是数据是否到过来显示
LinearLayoutManager manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
//HORIZONTAL横向显示
//LinearLayoutManager manager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
//网格布局 第二个参数是几列
//GridLayoutManager manager = new GridLayoutManager(this, 2,LinearLayoutManager.VERTICAL,false);
//瀑布流
//StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2,LinearLayoutManager.VERTICAL);
//添加分格线
recyclerview.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL));
//设置动画: 动画效果是添加或删除时候触发
recyclerview.setItemAnimator(new DefaultItemAnimator());
//添加布局管理器
recyclerview.setLayoutManager(manager);
//设置适配器 设置适配器最好方在最后
recyclerview.setAdapter(new RecyclerViewAdapter(this,list));
}
}
2:适配器
普通适配器
package activity.example.com.recycleview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
/**
* Created by 壹颗大金星 on 2017/11/9.
*/
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{
private Context context;
private List<ImageData> list;
public RecyclerViewAdapter(Context context, List<ImageData> list) {
this.context = context;
this.list = list;
}
//创建ViewHolder
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//子条目布局
View view = View.inflate(context, R.layout.itemlist, null);
ViewHolder holder = new ViewHolder(view);
return holder;
}
//绑定ViewHolder,把数据和视图进行绑定
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
holder.imageview.setImageResource(list.get(position).getImg());
holder.textview.setText(list.get(position).getTitle());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context,"点击了"+position,Toast.LENGTH_SHORT).show();
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
list.remove(position);
notifyDataSetChanged();//不能触发动画效果
//notifyItemRemoved(position);//能触发动画效果
//返回的是事件是否被消耗 false长按之后还会触发点击事件,true不会
return true;
}
});
}
@Override
public int getItemCount() {
if(list==null){
return 0;
}
return list.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TextView textview;
private ImageView imageview;
public ViewHolder(View itemView) {
super(itemView);
//itemView一个条目的视图
imageview = (ImageView)itemView.findViewById(R.id.imageView);
textview = (TextView)itemView.findViewById(R.id.textView);
}
}
}
多条目适配器
package com.mvprecyclerview.Adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.mvprecyclerview.Bean.DataList;
import com.mvprecyclerview.R;
import java.util.List;
/**
* Created by 壹颗大金星 on 2017/11/10.
*/
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private Context context;
private List<DataList> list;
public RecyclerViewAdapter(Context context, List<DataList> list) {
this.context = context;
this.list = list;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType==0){
View view = View.inflate(context, R.layout.item, null);
ViewHolder holder = new ViewHolder(view);
return holder;
}else{
View view = View.inflate(context, R.layout.item2, null);
ViewHolder2 holder2 = new ViewHolder2(view);
return holder2;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if(holder instanceof ViewHolder){
ViewHolder holder1 = (ViewHolder) holder;
Glide.with(context).load(list.get(position).getImg()).into(holder1.image);
holder1.tv_title.setText(list.get(position).getTitle());
holder1.tv_time.setText(list.get(position).getTime());
}else{
ViewHolder2 holder1 = (ViewHolder2) holder;
holder1.textview.setText(list.get(position).getTitle());
}
}
@Override
public int getItemCount() {
return list.size();
}
@Override
public int getItemViewType(int position) {
if(position%2==0){
return 0;
}else{
return 1;
}
}
class ViewHolder extends RecyclerView.ViewHolder{
private final ImageView image;
private final TextView tv_title;
private final TextView tv_time;
public ViewHolder(View itemView) {
super(itemView);
image = (ImageView)itemView.findViewById(R.id.image);
tv_title = (TextView)itemView.findViewById(R.id.tv_title);
tv_time = (TextView)itemView.findViewById(R.id.tv_time);
}
}
class ViewHolder2 extends RecyclerView.ViewHolder{
private final TextView textview;
public ViewHolder2(View itemView) {
super(itemView);
textview = (TextView)itemView.findViewById(R.id.textview);
}
}
}