RecyclerView是Android 5.0 materials design中的组件之一,相应的还有CardView、Palette等。看名字Re我们就能看出一点端倪,没错,它主要的特点就是复用。我们知道,Listview中的Adapter中可以实现ViewHolder的复用。RecyclerView提供了一个耦合度更低的方式来复用ViewHolder,并且可以轻松的实现ListView、GridView以及瀑布流的效果。
对于RecyclerView的初步使用,目标定为:
1.使用RecyclerView实现ListView和GridView之间的随意切换
2.为RecyclerView添加Item的点击和长按事件
3.对RecyclerView进行Item项的添加与删除操作
Demo的样图:
首先我们要搞清楚的与RecyclerView相关的类 Adapter(熟悉的适配器)、ViewHolder(Google为了规范开发者也是煞费苦心呐)、LayoutManager(用于设置RecyclerView的布局样式)、ItemDecoration(设置间距)、ItemAnimator(设置动画效果)具体为:
import android.support.v7.widget.RecyclerView.Adapter; import android.support.v7.widget.RecyclerView.ViewHolder;
import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView;使用RecyclerView需要引入你的Android SDK 中v7下的RecyclerView包
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:recyclerview-v7:23.0.1' compile 'com.android.support:appcompat-v7:23.0.1' }首先在布局中使用android.support.v7.widget.RecyclerView
<LinearLayout 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.xiaoping.recyclerview.MainActivity"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:text="Add"/>
<Button
android:id="@+id/btn_del"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:text="Del"/>
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:layout_marginTop="15dp"
android:layout_marginRight="15dp"
android:orientation="horizontal"
>
<RadioButton
android:id="@+id/radioList"
android:layout_width="50dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:gravity="center"
android:text="列表"
android:checked="true"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:textColor="@drawable/selector_tab_item_text"
android:background="@drawable/selector_radio_me"
android:button="@null"
/>
<RadioButton
android:id="@+id/radioGrid"
android:layout_width="50dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:gravity="center"
android:text="网格"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:textColor="@drawable/selector_tab_item_text"
android:background="@drawable/selector_radio_friends"
android:button="@null"
/>
</RadioGroup>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recylerview"
android:layout_height="match_parent"
android:layout_width="match_parent"/>
</LinearLayout>
在使用RecyclerView的过程中也可以类比我们熟悉的ListView
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private RecyclerView recyclerView;
private List<String> mList;
private MyAdapter adapter;
private RadioGroup radioGroup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDatas();
initView();
adapter = new MyAdapter(this, mList);
//为recyclerView设置适配器
recyclerView.setAdapter(adapter);
//为recyclerView设置布局方式
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
//为recyclerView设置Item的间距
//recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST));
//为recyclerView设置动画
recyclerView.setItemAnimator(new DefaultItemAnimator());
adapter.setOnItemClickLister(new MyAdapter.OnItemClickLister() {
@Override
public void OnItemClickLister(View view, int pos) {
Toast.makeText(MainActivity.this,"CLick:" + mList.get(pos),Toast.LENGTH_SHORT).show();
}
@Override
public void OnItemLongClickLister(View view, int pos) {
Toast.makeText(MainActivity.this,"LongCLick:" + mList.get(pos),Toast.LENGTH_SHORT).show();
}
});
}
private void initView() {
recyclerView = (RecyclerView) findViewById(R.id.recylerview);
findViewById(R.id.btn_add).setOnClickListener(this);
findViewById(R.id.btn_del).setOnClickListener(this);
radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId){
case R.id.radioList:
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false));
break;
case R.id.radioGrid:
recyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this,3,GridLayoutManager.VERTICAL,false));
break;
}
}
});
}
//准备数据
private void initDatas() {
mList = new ArrayList<String>();
for (int i = 'A'; i <= 'z'; i++) {
mList.add("" + (char)i);
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_add:
adapter.addItem(1);
break;
case R.id.btn_del:
adapter.delItem(0);
break;
}
}
}
适配器:
public class MyAdapter extends Adapter<MyViewHolder> {
private List<String> mList;
private Context mContext;
private LayoutInflater inflater;
public MyAdapter(Context context, List<String> list) {
this.mContext = context;
this.mList = list;
this.inflater = LayoutInflater.from(context);
}
public interface OnItemClickLister {
void OnItemClickLister(View view, int pos);
void OnItemLongClickLister(View view, int pos);
}
private OnItemClickLister itemClickLister;
public void setOnItemClickLister(OnItemClickLister itemClickLister) {
this.itemClickLister = itemClickLister;
}
@Override
public int getItemCount() {
return mList.size();
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int pos) {
holder.tv.setText(mList.get(pos));
if(itemClickLister != null){
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//使用ViewHolder取到的postion可以避免positon的错乱
int layoutPostion = holder.getLayoutPosition();
//回调接口中的方法
itemClickLister.OnItemClickLister(holder.itemView,layoutPostion);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int layoutPostion = holder.getLayoutPosition();
itemClickLister.OnItemLongClickLister(holder.itemView,layoutPostion);
return true;
}
});
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {
View view = inflater.inflate(R.layout.item, arg0, false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
public void addItem(int postion){
mList.add(postion, "AddItem");
//int pos = ViewHolder.getLayoutPosition();
notifyItemInserted(postion);
}
public void delItem(int postion){
if(mList.size() > postion){
mList.remove(postion);
//int pos = viewHolder.getLayoutPosition();
notifyItemRemoved(postion);
}
}
}
class MyViewHolder extends ViewHolder {
TextView tv;
public MyViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.tv_item);
}
}
点击下载源码