提到RecyclerView大家总会拿它与ListView相比较, RecyclerView是具有比ListView更具扩展性的控件, RecyclerView继承的是ViewGroup, 可以说也是ViewGroup的官方定义控件, RecyclerView顾名思义其专注于Recycler复用, 它不再管理布局, RecyclerView的布局由LayoutManager来管理了, Adapter的使用也不再像ListView那样继承BaseAdapter, 而是继承其内部类的RecyclerView.Adapter, 它是一个泛型类, 通常我们喜欢把它的泛型设置为RecyclerView.ViewHolder, RecyclerView.ViewHolde显然也是一个RecyclerView的内部类, 可见RecyclerView已经把Adapter和ViewHolder完全封装成自己的内部类, 其高度的Recycler思想可想而知.
RecyclerView的使用通常会涉及到一下几个方法:
// 1.配置效率
mRecyclerView.setHasFixedSize(true);
// 2.配置布局
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
// 3.配置Adapter
mCustomAdapter = new CustomAdapter(this, mDatas);
mRecyclerView.setAdapter(mCustomAdapter);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
发现并没有像ListView那样直接设置条目点击监听的方法, 如何实现RecyclerView的条目点击监听呢?这里采用接口回调的方式实现;
先看RecyclerView的Adapter代码
package com.suosuoshu.recyclerview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
// 自定义CustomAdapter 继承RecyclerView.Adapter
public class CustomAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
private List<Student> mDatas;
// 采用接口回调的方式实现RecyclerView的ItemClick
public OnRecyclerViewListener mOnRecyclerViewListener;
// 接口回调第一步: 定义接口和接口中的方法
interface OnRecyclerViewListener {
void onItemClick(int position);
boolean onItemLongClick(int position);
}
// 接口回调第二步: 初始化接口的引用
public void setOnRecyclerViewListener(OnRecyclerViewListener l) {
this.mOnRecyclerViewListener = l;
}
public CustomAdapter(Context context, List<Student> datas) {
mContext = context;
mDatas = datas;
}
// 自定义ViewHolder
public class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
public final TextView mTextName;
public final TextView mTextAge;
// 注意这里的position与CustomViewHolder是对应的关系, 每个CustomViewHolder都有mTextName和mTextAge, 还有它的mPosition
public int mPosition;
public CustomViewHolder(View itemView) {
super(itemView);
mTextName = (TextView) itemView.findViewById(R.id.name);
mTextAge = (TextView) itemView.findViewById(R.id.age);
// 巧妙的调用了View的点击方法
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
}
// 接口回调第三步, 实现onClick, 方法中是调用了接口的onItemClick抽象方法, 所以这里之后肯定会被回调回来
@Override
public void onClick(View v) {
if (mOnRecyclerViewListener != null) {
mOnRecyclerViewListener.onItemClick(mPosition);
}
}
@Override
public boolean onLongClick(View v) {
if (mOnRecyclerViewListener != null) {
return mOnRecyclerViewListener.onItemLongClick(mPosition);
}
return false;
}
}
// RecyclerView.Adapter的三个抽象方法实现
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.itme_layout, null);
CustomViewHolder customViewHolder = new CustomViewHolder(view);
return customViewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
CustomViewHolder customViewHolder = (CustomViewHolder) holder;
customViewHolder.mTextName.setText(mDatas.get(position).name);
customViewHolder.mTextAge.setText(mDatas.get(position).age);
customViewHolder.mPosition = position;
}
@Override
public int getItemCount() {
return mDatas != null ? mDatas.size() : 0;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
这是MainActivity 中的代码
package com.suosuoshu.recyclerview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements CustomAdapter.OnRecyclerViewListener {
private RecyclerView mRecyclerView;
private List<Student> mDatas;
private CustomAdapter mCustomAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
// 初始化控件
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
}
// 初始化数据
private void initData() {
// 这里是模拟数据
mDatas = new ArrayList<>();
for (int i = 0; i < 100; i++) {
Student student = new Student("明明", "18");
mDatas.add(student);
}
// 1.配置效率
mRecyclerView.setHasFixedSize(true);
// 2.配置布局
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
// 3.配置Adapter
mCustomAdapter = new CustomAdapter(this, mDatas);
mRecyclerView.setAdapter(mCustomAdapter);
// 4.注意, 是让Adapter去设置点击监听事件,setOnRecyclerViewListener方法是在CustomAdapter中定义的
mCustomAdapter.setOnRecyclerViewListener(this);
}
// 接口回调第四步, 这是才是最终被调用的方法
@Override
public void onItemClick(int position) {
Toast.makeText(MainActivity.this, "点击了第" + position + "个条目", Toast.LENGTH_SHORT).show();
}
@Override
public boolean onItemLongClick(int position) {
return false;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
一个简单的Bean类模拟数据
package com.suosuoshu.recyclerview;
public class Student {
public String name;
public String age;
public Student(String name, String age) {
this.name = name;
this.age = age;
}
}