RecycleView是谷歌V7包中新增的控件,用于替代以往多数据显示的控件(ListView,GridView…),一个新的替代的事物的出现,必定有这比之前更便捷灵活的特性。那么为什么RecycleView为什么会用来替代ListView和GridView呢?
结构高度灵活
内部实现内存回收
RecycleView的显示和数据加载全部分解成了几块去分别管理,以往从ListView转换成GridView需要重写布局和代码,但是现在你只需要改变一下LayoutManager就可以了,高度解耦了功能之间的联系。
下面就说一下RecycleView的基本应用,而后几章中会补充自定义的 LayoutManager 和自定义的 ItemDecoration 来更好的扩展。
dependencies {
...
compile 'com.android.support:cardview-v7:23.1.1'
compile 'com.android.support:recyclerview-v7:23.1.1'
}
"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.demo.demorecycleview.MainActivity">
"@+id/my_recycleView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorAccent"
android:orientation="vertical">
"match_parent"
android:layout_height="wrap_content">
"@+id/tv_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="123"
android:textSize="20sp"
android:textColor="@color/white"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"/>
注!:Item的布局会对显示有很大的影响,如果在根容器中直接写控件,显示出来的结果相当于宽高根据控件最小的范围自适应,造成不一样的结果。所以Item在编写时最好在根容器内添加一个容器用来控制Item的间距,这样适用于简单的布局可以用这个笨方法,但是最终还是建议通过ItemDecoration来控制Item之间的间距
package com.demo.demorecycleview.Adapter;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.demo.demorecycleview.R;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
* Created by UnableApe
*/
public class MyRecycleViewAdapter extends RecyclerView.Adapter<MyRecycleViewAdapter.MyViewHolder> {
private List mListData;
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycleview, null);
MyViewHolder mHolder = new MyViewHolder(view);
return mHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tvItem.setText(mListData.get(position));
}
@Override
public int getItemCount() {
return mListData.size();
}
public void setListData(List list) {
mListData = list;
notifyDataSetChanged();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
@Bind(R.id.tv_item)
TextView tvItem;
MyViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
}
}
}
自定义Adapter需重写三个方法,如上
onCreateViewHolder(ViewGroup parent, int viewType)
此方法根据不同的viewType返回不同的holder
onBindViewHolder(MyViewHolder holder, int position)
此方法根据holder绑定相关数据
getItemCount()
此方法返回数据的数量
另外还会有
getItemViewType(int position)
此方法跟距position返回不同的item的布局
会在多数据显示之强大的RecycleView 使用完全解析(中级篇)详细介绍
package com.demo.demorecycleview;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.demo.demorecycleview.Adapter.MyRecycleViewAdapter;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity {
@Bind(R.id.my_recycleView)
RecyclerView myRecycleView;
private MyRecycleViewAdapter mAdapter;
private List mListData ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initData();
initView();
}
private void initView() {
//设置显示方式
LinearLayoutManager llManager = new LinearLayoutManager(this);
llManager.setOrientation(LinearLayoutManager.VERTICAL);
myRecycleView.setLayoutManager(llManager);
//设置Adapter
mAdapter = new MyRecycleViewAdapter();
mAdapter.setListData(mListData);
myRecycleView.setAdapter(mAdapter);
}
private void initData() {
mListData = new ArrayList();
for(int i =1;i<15;i++){
mListData.add("这是第"+i+"个Item");
}
}
}
实现多个ViewType 自定义LayoutManager实现不同的显示方式 自定义ItemDecoration 以及RecycleView的相关注意问题
多数据显示之强大的RecycleView 使用完全解析(中级篇)