创建RecyclerView
在build.gradle中添加依赖
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:25.1.0'
// DONE (1) Add RecyclerView dependency
compile 'com.android.support:recyclerview-v7:25.1.0'
}
在资源文件中的使用RecyclerView
<android.support.v7.widget.RecyclerView
android:layout_height="match_parent"
android:layout_width="match_parent" />
在RecyclerView中添加Item
在Res/layout资源文件中添加number_list_item, 每个item是一个Framlayout其中仅包括一个TextView
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:padding="16dp">
<TextView
android:id="@+id/tv_item_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textAlignment="textStart"
android:textSize="42sp"
android:fontFamily="monospace"/>
</FrameLayout>
在Java文件中,创建一个新的类GreenAdapter 继承于RecyclerView.Adapter, 在GreenAdapter中创建一个内部类NumberViewHolder 继承于RecyclerView.ViewHolder.
class NumberViewHolder extends RecyclerView.ViewHolder {
TextView listItemNumberView;
public NumberViewHolder(View itemView) {
super(itemView);
listItemNumberView = (TextView) itemView.findViewById(R.id.tv_item_number);
}
void bind(int listIndex) {
listItemNumberView.setText(String.valueOf(listIndex));
}
}
bind()函数是用来改变每个Item中TextView的内容.
在RecyclerView与Adapter
Adapter
Adapter的作用:
- 创建新的item
- 向item中填充数据
- 返回信息
首先我们要先创建GreenAdapter类, 继承于RecyclerView.Adapter
public class GreenAdapter extends RecyclerView.Adapter<GreenAdapter.NumberViewHolder>{
Adapter需要我们重写3个函数:
- onCreateViewHolder : 用于RecyclerView实例化一个新的ViewHolder实例 (inflate itemviews, 创建并返回ViewHolder)
@Override
public NumberViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
Context context = viewGroup.getContext();
int layoutIdForListItem = R.layout.number_list_item;
LayoutInflater inflater = LayoutInflater.from(context);
boolean shouldAttachToParentImmediately = false;
View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately);
NumberViewHolder viewHolder = new NumberViewHolder(view);
return viewHolder;
}
- onBindViewHolder : 用于向模型中填充数据,使用户可以看到它的时候调用, 更有效的绑定数据源
@Override
public void onBindViewHolder(NumberViewHolder holder, int position) {
Log.v("NumberViewHolder","bind "+ position);
holder.bind(position);
}
- getItemCount : 用于返回数据源中的显示的项目数 (有助于Layout View 管理后台的动画)
@Override
public int getItemCount() {
return mNumberItems;
}
RecyclerView布局管理器
这里有3种布局管理器:
LinearLayoutManager - 线型
GridLayoutManager - 网格型
StaggeredGridLayoutManager - 交错型
public class MainActivity extends AppCompatActivity {
private static final int NUM_LIST_ITEMS = 100;
GreenAdapter mAdapter;
RecyclerView mNumberList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNumberList = (RecyclerView) findViewById(R.id.rv_numbers);
// 创建 LinearLayoutManager
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
mNumberList.setLayoutManager(layoutManager);
// RecyclerView的内容不会改变item的尺寸
mNumberList.setHasFixedSize(true);
mAdapter = new GreenAdapter(NUM_LIST_ITEMS);
// 对RecyclerView设置Adapter
mNumberList.setAdapter(mAdapter);
}
}
处理点击操作
要让RecyclerView响应点击事件需要:
1. 创建一个ListItemClickListener的接口
2. 在NumberViewHolder中实现 View.OnClickListener
GreenAdapter.java
首先在GreenAdapter中创建一个ListItemClickListener的接口, 方法中的num参数是点击事件中,被点击项目的编号。
// DONE (1) Add an interface called ListItemClickListener
// DONE (2) Within that interface, define a void method called onListItemClick that takes an int as a parameter
interface ListItemClickListener{
void onListItemClick(int num);
}
在GreenAdapter中添加final属性的成员变量ListItemClickListener,
// DONE (3) Create a final private ListItemClickListener called mOnClickListener
private final ListItemClickListener mOnClickListener;
……
并在GreenAdapter的构造函数中,初始化这个成员变量。
// DONE (4) Add a ListItemClickListener as a parameter to the constructor and store it in mOnClickListener
public GreenAdapter(int numberOfItems, ListItemClickListener onClickListener) {
mNumberItems = numberOfItems;
mOnClickListener = onClickListener;
viewHolderCount = 0;
}
让GreenAdapter中的NumberViewHolder实现View.OnclickListener接口, 并把Lisener传递给itemView。
// DONE (5) Implement OnClickListener in the NumberViewHolder class
class NumberViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public NumberViewHolder(View itemView) {
super(itemView);
listItemNumberView = (TextView) itemView.findViewById(R.id.tv_item_number);
viewHolderIndex = (TextView) itemView.findViewById(R.id.tv_view_holder_instance);
// DONE (7) Call setOnClickListener on the View passed into the constructor (use 'this' as the OnClickListener)
itemView.setOnClickListener(this);
}
。。。
// DONE (6) Override onClick, passing the clicked item's position (getAdapterPosition()) to mOnClickListener via its onListItemClick method
@Override
public void onClick(View v) {
int position = getAdapterPosition();
mOnClickListener.onListItemClick(position);
}
}
MainActivity.java
在MainActivity中实现我们刚刚创建的接口
// DONE (8) Implement GreenAdapter.ListItemClickListener from the MainActivity
public class MainActivity extends AppCompatActivity implements GreenAdapter.ListItemClickListener{
// DONE (9) Create a Toast variable called mToast to store the current Toast
private Toast mToast;
。。。
// DONE (10) Override ListItemClickListener's onListItemClick method
@Override
public void onListItemClick(int num) {
// DONE (11) In the beginning of the method, cancel the Toast if it isn't null
// DONE (12) Show a Toast when an item is clicked, displaying that item number that was clicked
if(mToast != null)
mToast.cancel();
mToast = Toast.makeText(this,num + " is clicked", Toast.LENGTH_SHORT);
mToast.show();
}
}
在onCreate()中,把MainActivity传入作为Listener。
mAdapter = new GreenAdapter(NUM_LIST_ITEMS, this);