RecycleView的简单使用

来源:互联网 发布:linux c va list 编辑:程序博客网 时间:2024/06/05 02:02
Demo地址:http://download.csdn.net/detail/baopengjian/9883889
一、RecyclerView导入依赖包
1. eclipse 上的导入:
如下进入Android SDK的如下路径,\androidsdk\extras\android\m2repository\com\android\support\recyclerview-v7\
找到和自己当前android api版本相同的目录,这里以21.0.0为例:
进入21.0.0命名的目录,找到recyclerview-v7-21.0.0.aar, 复制一份该文件在当下目录,然后修改其后缀为:
recyclerview-v7-21.0.0 - 副本.aar.rar 然后解压该.rar压缩包,
修改其中的classes.jar 文件名为:recyclerview-v7-21.0.0.jar
将该包导入到需要用到RecyclerView的项目中即可。
 
2. Android Studio中的导入:
每个sdk对应的recyclerview包的版本不同,如何引入正确的?
appcompat与recyclerview的版本一样的,而appcompat在新建项目时会自动导入,复制其compile,将其替换成recyclerview,如:
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support:recyclerview-v7:26.+'

二、简单用法:
支持:RecyclerView在最新v7包中,也可以直接使用其jar包,在demo 001中;
android-support-v7-recyclerview.jar
support-annotations-21.0.0-rc1.jar
  1.跟ListView 一样 需要一个 Adapter
  2.跟ListView 一样 需要一个 ViewHolder
  3.有点不同了, 需要一个LayoutManager


 三、Demo
(1)布局:
ss
(2)Activity:RecyclerView和ListView的用法不同在于要设置一个线性布局管理器
ss

ss
(3)Adapter
ss
ss
四、三种布局模式
#1 线性布局
1.效果图
2.代码:
RecyclerAdapter adapter = new RecyclerAdapter(st);
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
rv.setLayoutManager(manager);
rv.setAdapter(adapter);

#2 网格布局
1.效果图
2.代码:
//3表示3列,false表示是否方向显示布局(从下往上),item的宽度为1/3,高度为最高的Type类型item高度
GridLayoutManager manager = new GridLayoutManager(this,3,GridLayoutManager.VERTICAL,false);
rv.setLayoutManager(manager);

#3 交错网格布局
1.效果图
2.代码:
StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
rv.setLayoutManager(manager)

五、加载不同布局
通过定义多个ViewHold在Adapter中根据具体情况加载不同布局
class GridAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener{

private Context mContext;
private List<Integer> datas;//数据

public GridAdapter(Context context,List<Integer> datas) {
mContext=context;
this.datas=datas;
}

@Override
public int getItemViewType(int position) {
//根据具体情况,设置不同的ViewType,
if(datas.get(position)%2 == 0){
return 0;
}else{
return 1;
}
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//根据不同的ViewType,从而加载不同的布局
if(viewType == 0){
View view = LayoutInflater.from(mContext
).inflate(R.layout.adapter_grid_item1, parent,
false);//这个布局就是一个imageview用来显示图片
MyViewHolder1 holder = new MyViewHolder1(view);
return holder;
}else{
View view = LayoutInflater.from(mContext
).inflate(R.layout.adapter_grid_item2, parent,
false);//这个布局就是一个imageview用来显示图片
MyViewHolder2 holder = new MyViewHolder2(view);
return holder;
}
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if(holder instanceof MyViewHolder1){
((MyViewHolder1)holder).setData(datas.get(position));
}else if(holder instanceof MyViewHolder2){
((MyViewHolder2)holder).setData(datas.get(position));
}
}

@Override
public int getItemCount() {
return datas.size();
}

@Override
public void onClick(View view) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(view);
}
}

class MyViewHolder1 extends RecyclerView.ViewHolder{

public MyViewHolder1(View itemView) {
super(itemView);
}

public void setData(int data){
((TextView)itemView.findViewById(R.id.textView2)).setText("position:"+data);
}
}

class MyViewHolder2 extends RecyclerView.ViewHolder{

public MyViewHolder2(View itemView) {
super(itemView);
}

public void setData(int data){
}

}

六 简单实现下滑自动加载更多
int lastVisibleItem
...
rv.addOnScrollListener(new RecyclerView.OnScrollListener(){
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//0:当前屏幕停止滚动;1时:屏幕在滚动 且 用户仍在触碰或手指还在屏幕上;2时:随用户的操作,屏幕上产生的惯性滑动;
// 滑动状态停止并且剩余少于两个item时,自动加载下一页
if (newState == RecyclerView.SCROLL_STATE_IDLE
&& lastVisibleItem +2>=manager.getItemCount()) {
Toast.makeText(RecyclerViewLinearlayoutActivity.this,"加载更多...",Toast.LENGTH_SHORT).show();
}
}

@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
lastVisibleItem = manager.findLastVisibleItemPosition();
}
});