Android5.0后谷歌推出Recyclerview替代ListView,Gridview,接下来实现一个Recyclerview的简单功能,先上效果图:
实现了点击事件,添加分割线,自定义分割线样式,增加删除item。
1.引入v7库。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:24.1.1'
compile 'com.android.support:recyclerview-v7:24.1.1'
}
2.初始化,为recyclerview设置属性,代码里有注释
private RecyclerView recyclerView;
private List<String> mdata;
private MyAdapter adapter;
private LinearLayoutManager layoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();//初始化数据,供测试使用
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);//设置布局管理器,这里设置的是线性布局,还可以设置网格布
局和流布局 // recyclerView.setLayoutManager(new GridLayoutManager(this,4));网格布局
//recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));流布局
adapter = new MyAdapter(this, mdata);//自定义适配器
recyclerView.setAdapter(adapter);//设置适配器
recyclerView.addItemDecoration(new DividerItem(this));//增加分割线
adapter.setOnItemCliclkListener(this);//设置点击事件
}
private void initData() {
mdata = new ArrayList<String>();
for (int i = 0; i < 50; i++) {
mdata.add("第" + i + "个数字");
}
}
3.点击事件的实现
@Override
public void onItemClick(View view, int position) {
Toast.makeText(MainActivity.this, "第" + position + "个", Toast.LENGTH_SHORT).show();
}
public void addItem(View view) {
int position=layoutManager.findFirstCompletelyVisibleItemPosition();
adapter.addData(position);
}
public void deleteItem(View view) {
int position=layoutManager.findFirstCompletelyVisibleItemPosition();
adapter.removeData(position);
}
这里的position拿的是第一个,实际开发中根据自己的需要添加删除。
4.Adapter的实现,这里主要是实现加载子布局,设置数据,定义接口,实现点击事件
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private Context context;
private List<String> mData;
private MyItemOnClickListener onItemClickListener;
public MyAdapter(Context context, List<String> data) {
this.context = context;
this.mData = data;
}
/*
加载布局,返回自定义的ViewHolder
*/
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.recycleritem, viewGroup, false));
return holder;
}
/**
* 设置数据到view中
*/
@Override
public void onBindViewHolder(MyAdapter.MyViewHolder myViewHolder, final int i) {
myViewHolder.textView.setText(mData.get(i));
if(onItemClickListener!=null){ myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListener.onItemClick(view, myViewHolder.getLayoutPosition());
}
});
}
}
@Override
public int getItemCount() {//得到条目数
return mData.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
private TextView textView;
public MyViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.textview);
}
}
/*
点击事件设置
*/
public void setOnItemCliclkListener(MyItemOnClickListener itemCliclkListener) {
this.onItemClickListener = itemCliclkListener;
}
public interface MyItemOnClickListener {
public void onItemClick(View view, int position);
}
public void addData(int position){
mData.add(position,"add item");
notifyItemInserted(position);
}
public void removeData(int position){
mData.remove(position);
notifyItemRemoved(position);
}
5.分割线的添加,在MainActivity中recyclerView.addItemDecoration(new DividerItem(this));增加了一条自己实现的分割线。具体的解释代码中有。
public class DividerItem extends RecyclerView.ItemDecoration{
private static final int[] attrs={android.R.attr.listDivider};
private Drawable mDrawable;
public DividerItem(Context context){
TypedArray array=context.obtainStyledAttributes(attrs);
mDrawable=array.getDrawable(0);
array.recycle();
}
/*
绘制列表项的分割条
*/
@Override
public void onDrawOver(Canvas c, RecyclerView parent) {
super.onDrawOver(c, parent);
int left=parent.getPaddingLeft();//距离左边的距离
int right=parent.getWidth()-parent.getPaddingRight();//距离右边的距离
int chilidcount=parent.getChildCount();//获取列表项的总数
//绘制分割线
for (int i=0;i<chilidcount;i++){
View child=parent.getChildAt(i);//获取当前的列表项
RecyclerView.LayoutParams params=(RecyclerView.LayoutParams)child.getLayoutParams();
//获得参数布局
int top=child.getBottom()+params.bottomMargin;//获得左上角的垂直距离
int bottom=top+mDrawable.getIntrinsicHeight();//获得右下角的垂直距离
mDrawable.setBounds(left,top,right,bottom);//设置位置
mDrawable.draw(c);//绘制分割线
}
}
6.自定义分割线样式需要在style.xml中添加,具体实现如下:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="android:listDivider">@drawable/divideritems</item>
</style>
然后新建divideriem文件,在里面设置分割线的属性。
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:centerColor="@color/material_grey_600"
android:startColor="@color/material_grey_600"
android:endColor="@color/material_grey_600"
android:type="linear"></gradient>
<size android:height="1dp"></size>
</shape>
源码地址如下:点击打开链接