1.RecyclerView,源码中的定义:
A flexible view for providing a limited window into a large data set.
简单的说法就是在有限的空间里展示大量的数据。
2.使用前准备:
(1).首先要建立两个layout文件:一个是引入RecyclerView组件,另一个是RecyclerView中的item布局,这一点跟ListView类似。
引入RecyclerView组件(fragment_reports_list.xml,该文件中需要引用item的布局文件):
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView 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:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
app:layoutManager="LinearLayoutManager"
//引用item的布局文件
tools:listitem="@layout/fragment_news" />
RecyclerView中的item布局(fragment_news.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/text_margin"
android:textAppearance="?attr/textAppearanceListItem" />
<TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/text_margin"
android:textAppearance="?attr/textAppearanceListItem" />
</LinearLayout>
(2):同ListView一样,RecyclerView也需要实现自己的adapter,只是RecyclerView的adapter需要继承RecyclerView.Adapter而不是BaseAdapter。实现RecyclerView的adapter:
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder>{
List<DummyContent.DummyItem> list;
public MyRecyclerViewAdapter(List<DummyContent.DummyItem> list){
this.list = list;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_news, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mItem = list.get(position);
final String itemId = list.get(position).id;
holder.mIdView.setText(list.get(position).id);
holder.mContentView.setText(list.get(position).content);
holder.mContentView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//组件点击事件
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
public final View mView;
public final TextView mIdView;
public final TextView mContentView;
public DummyContent.DummyItem mItem;
public ViewHolder(View view) {
super(view);
mView = view;
mIdView = (TextView) view.findViewById(R.id.id);
mContentView = (TextView) view.findViewById(R.id.content);
}
@Override
public String toString() {
return super.toString() + " '" + mContentView.getText() + "'";
}
}
}
这里的DummyContent.DummyItem和DummyContent使用官方demo自带的定义类:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Helper class for providing sample content for user interfaces created by
* Android template wizards.
* <p/>
* TODO: Replace all uses of this class before publishing your app.
*/
public class DummyContent {
/**
* An array of sample (dummy) items.
*/
public static final List<DummyItem> ITEMS = new ArrayList<DummyItem>();
/**
* A map of sample (dummy) items, by ID.
*/
public static final Map<String, DummyItem> ITEM_MAP = new HashMap<String, DummyItem>();
private static final int COUNT = 25;
static {
// Add some sample items.
for (int i = 1; i <= COUNT; i++) {
addItem(createDummyItem(i));
}
}
private static void addItem(DummyItem item) {
ITEMS.add(item);
ITEM_MAP.put(item.id, item);
}
private static DummyItem createDummyItem(int position) {
return new DummyItem(String.valueOf(position), "Item " + position, makeDetails(position));
}
private static String makeDetails(int position) {
StringBuilder builder = new StringBuilder();
builder.append("Details about Item: ").append(position);
for (int i = 0; i < position; i++) {
builder.append("\nMore details information here.");
}
return builder.toString();
}
/**
* A dummy item representing a piece of content.
*/
public static class DummyItem {
public final String id;
public final String content;
public final String details;
public DummyItem(String id, String content, String details) {
this.id = id;
this.content = content;
this.details = details;
}
@Override
public String toString() {
return content;
}
}
}
(3).最后就是在fragment或者activity中开始使用RecyclerView:
View view = inflater.inflate(R.layout.fragment_reports_list, container, false);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.list);
MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(DummyContent.ITEMS);
recyclerView.setAdapter(adapter);
利用Android studio新建工程时选择Master/Detail Flow时可以自动生成关于RecyclerView的demo。