您的位置:首页 > 其它

踏平RecyclerView使用的各种坑,跟ListView和GridView说拜拜

2016-11-30 13:47 363 查看
RecyclerView是谷歌推出的新View,使用和listview差不多。

在此之前推荐一本书:跟着敲一遍你能从中级变高级,从习惯eclipse变成使用Android studio大神。



但是RecyclerView对于初学者还是有点难度,下面以最简短的代码让你一眼明白并牢记RecyclerView的使用方法

mRecyclerView = findViewById(R.id.id_recyclerview);
//设置布局管理器
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置adapter
mRecyclerView.setAdapter(adapter)
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//添加分割线
mRecyclerView.addItemDecoration(new MyItemDecoration(
this, MyItemDecoration.HORIZONTAL));


只有这四个方法简单吗??、

特别需要做的是写自己的adapter

使用步骤:

①创建RecyclerView 对象

②设置适配器adapter

完成了。。。。

所以只要会写adapter就会用RecyclerView了

最简单的使用demo可参考http://blog.csdn.net/gfg156196/article/details/51727783

使用中的过程总结:

①导包,请导入RecyclerView的包,不要选择V7包。

compile 'com.android.support:recyclerview-v7:25.0.1'

②创建自己的adapter

/**
* Created by yugu88 on 2016/11/29.15:14
* 注意点:必须使用泛型Adapter<RecHoder>
*/

public class RecAdapter extends RecyclerView.Adapter<RecHoder> {
Activity content;
String[] menu_text;

public RecAdapter(Activity content, String[] menu_text) {
this.content=content;
this.menu_text=menu_text;
}

/**
* @return RecHoder 修改此返回类型为自己定义的ViewHolder
*/
@Override
public RecHoder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater=LayoutInflater.from(content);
View view=layoutInflater.inflate(R.layout.adapter_listview_menu, parent, false);
return new RecHoder(view);//创建自己的ViewHolder并返回此对象
}

/**
* @param holder 修改此ViewHolder的类型为自己定义的RecHoder
*/
@Override
public void onBindViewHolder(RecHoder holder, final int position) {

holder.tv_menu.setText(menu_text[position]);

Log.e("getItemCount",position+"");
holder.tv_menu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}

@Override
public int getItemCount() {
return menu_text.length;
}

}

③创建自己的ViewHolder

/**
* Created by yugu88 on 2016/11/29.15:52
*/

public class RecHoder extends RecyclerView.ViewHolder {

public TextView tv_menu;

public RecHoder(View itemView) {
super(itemView);
tv_menu=(TextView) itemView.findViewById(R.id.tv_menu);
}
}

④在Activity中使用RecyclerView

listview_menu=(RecyclerView) findViewById(R.id.listview_menu);
listview_menu.setLayoutManager(new LinearLayoutManager(this));// 此句最最重要LinearLayoutManager就是listview类型的
//listview_menu.setLayoutManager(new GridLayoutManager(this,4));// 此为GridView类型的视图 4列
//创建adapter对象
RecAdapter recAdapter=new RecAdapter(this, menu_text);
//设置adapter
listview_menu.setAdapter(recAdapter);

setLayoutManager();的参数有如下几种:

LinearLayoutManager 线性管理器。支持横向、纵向。

GridLayoutManager 网格布局管理器

StaggeredGridLayoutManager 瀑布就式布局管理器


如果需要分割线:

// 第二个参数是横线或者竖线的意思
listview_menu.addItemDecoration(new RecycleViewDivider(this, LinearLayoutManager.HORIZONTAL));

可以在setAdapter(recAdapter)之前或者之后都可以。

LinearLayoutManager.HORIZONTAL 表示分割线是横着画的,一般用在垂直滚动的listview。如下。



addItemDecoration该方法的参数为RecyclerView.ItemDecoration,该类为抽象类,我们需要继承它写一个自己的类。

它的源码很短,如下:

public static abstract class ItemDecoration {

public void onDraw(Canvas c, RecyclerView parent, State state) {
onDraw(c, parent);
}

@Deprecated
public void onDraw(Canvas c, RecyclerView parent) {
}

public void onDrawOver(Canvas c, RecyclerView parent, State state) {
onDrawOver(c, parent);
}

@Deprecated
public void onDrawOver(Canvas c, RecyclerView parent) {
}

@Deprecated
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
outRect.set(0, 0, 0, 0);
}

public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {
getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),
parent);
}
}

方法都没有实现,我们继承它实现自己的方法即可。

注意:onDraw方法,使用带有State state参数的方法。。

具体的画线的类如何写可以参考http://www.cnblogs.com/huolongluo/p/5879292.html

如果你实在是懒得写分割线,可以直接把别人的分割线类拿来使用。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息