RecyclerView是Android 5.0 materials design中的組件之一,相應的還有CardView、Palette等。看名字我們就能看出一點端倪,沒錯,它主要的特點就是複用。我們知道,Listview中的Adapter中可以實現ViewHolder的複用。RecyclerView提供了一個耦合度更低的方式來複用ViewHolder,並且可以輕鬆的實現ListView、GridView以及瀑布流的效果。
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
然後你有兩個選擇<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/item_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
public static class MyViewHolder extends RecyclerView.ViewHolder {
public MyViewHolder(View itemView) {
super(itemView);
}
}
(2)這個Adapter繼承的不是BaseAdapter而是RecyclerView.Adapter public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public MyViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.item_text);
}
}
@Override
public int getItemCount() {
return 0;
}
b.相當於ListView中contentView爲空時創建一樣 @Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
c.無論是新創建的或者是原有的需要將數據綁定 @Override
public void onBindViewHolder(MyViewHolder holder, int position) {
}
(4)跟listView差不多的是你可以將數據和context利用構造方法傳入Adapter中 private List<String> list;
private Context context;
public MyAdapter(List<String> list, Context context) {
this.list = list;
this.context = context;
}
(5)實現你的抽象方法
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.textView.setText(list.get(position));
}
@Override
public int getItemCount() {
return list.size();
}
5.創建數據源和綁定Adapter
package com.lw.myrecyclerview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private RecyclerView myRecyclerVIew;
private ArrayList<String> list;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
myAdapter = new MyAdapter(list, this);
myRecyclerVIew.setAdapter(myAdapter);
myRecyclerVIew.setLayoutManager(new LinearLayoutManager(this));
}
private void initView() {
myRecyclerVIew = ((RecyclerView) findViewById(R.id.myRecyclerView));
}
private void initData() {
list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add(String.format(Locale.CHINA,"第%03d條數據",i));
}
}
}
以上一個最爲基本的RecyclerView就完成了,實現的是一個ListView的效果,但是跟listVIew還有一些區別,就是他沒有分割線,而且你會發現他沒有什麼setOnItemClickListener,那麼他的點擊事件如何實現呢,都會在下篇文章中統一說明。源碼會在最後一篇文章給出。