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>
源碼地址如下:點擊打開鏈接