准备工作
- 这是v7包中的控件
- AndroidStudio在gradle中配置
compile 'com.android.support:recyclerview-v7:23.1.0'
- Eclipse导入jar包,搜索:recyclerview-v7
第一个RecyclerView的使用
简单的就不写了,直接带Item点击监听的。
- 布局文件
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
- Holder
每个Holder就是每个Item,操控Holder就是操控Item
/**
* 每个Item需要什么样的监听,Holder就必须实现这个能力,即实现这个接口
*/
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private Button btn;
private MyItemClickListener myItemClickListener;
public MyViewHolder(View view, MyItemClickListener myItemClickListener) {
super(view);
btn = (Button) view.findViewById(R.id.item);
btn.setOnClickListener(this);// 把这个能力赋予给具体的控件上
this.myItemClickListener = myItemClickListener;
}
/**
* 获取到监听事件
* @param v
*/
@Override
public void onClick(View v) {
if (myItemClickListener != null) {
myItemClickListener.onItemClick(v, getPosition());
}
}
/**
* 外部接口,让外部获取到Item中的Button对象
* @return
*/
public Button getButton() {
return btn;
}
}
- 监听接口
public interface MyItemClickListener {
void onItemClick(View view, int postion);
}
- Adapter
Adapter负责操控Holder
/**
* 继承时必须传入自定义的Holder对象
*/
public class RecyclerViewAdapter extends RecyclerView.Adapter<MyViewHolder> {
private List<String> mDatas;
private Context mContext;
private LayoutInflater inflater;
private MyItemClickListener myItemClickListener;
/**
* 构造方法,获取必要参数
* @param context
* @param datas
*/
public RecyclerViewAdapter(Context context, List<String> datas) {
this.mContext = context;
this.mDatas = datas;
inflater = LayoutInflater.from(mContext);
}
/**
* 创建Holder对象,界面显示多少就创建多少个
* @param parent
* @param viewType
* @return
*/
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.item_view, parent, false);
MyViewHolder holder = new MyViewHolder(view, myItemClickListener);
return holder;
}
/**
* 绑定Holder对象,创建后就绑定
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Button btn = holder.getButton();
btn.setText(mDatas.get(position));
}
/**
* 总共有多少个Item
* @return
*/
@Override
public int getItemCount() {
return mDatas.size();
}
/**
* 外部接口,传递点击事件
* @param myItemClickListener
*/
public void setMyItemClickListener(MyItemClickListener myItemClickListener) {
this.myItemClickListener = myItemClickListener;
}
}
- Activity
Activity通过Adapter对RecyclerView 进行全面的操控
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private List<String> mDatas;
private RecyclerViewAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.rv);
initData();
mAdapter = new RecyclerViewAdapter(MainActivity.this, mDatas);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(layoutManager); //设置布局管理器
layoutManager.setOrientation(OrientationHelper.VERTICAL); //设置为垂直布局,这也是默认的
mRecyclerView.setAdapter(mAdapter);//设置Adapter
mRecyclerView.setItemAnimator(new DefaultItemAnimator()); //设置增加或删除条目的动画
/**
* 通过适配器操控点击事件,虽然怪怪的,但是原则上是最好的
*/
mAdapter.setMyItemClickListener(new MyItemClickListener() {
@Override
public void onItemClick(View view, int postion) {
Toast.makeText(MainActivity.this, "点击了" + postion, Toast.LENGTH_SHORT).show();
}
});
}
private void initData() {
mDatas = new ArrayList<String>();
for (int i = 0; i < 40; i++) {
mDatas.add("item" + i);
}
}
}