您的位置:首页 > 移动开发 > Android开发

android 控件 recyclerview

2016-09-20 15:32 302 查看

概括

你想要控制其显示的方式,请通过布局管理器LayoutManager

你想要控制Item间的间隔(可绘制),请通过ItemDecoration

你想要控制Item增删的动画,请通过ItemAnimator

你想要控制点击、长按事件,请自己写(擦,这点尼玛。)

mRecyclerView = findView(R.id.id_recyclerview);

mRecyclerView.setLayoutManager(layout);//设置布局管理器

mRecyclerView.setAdapter(adapter);//设置adapter

mRecyclerView.setItemAnimator(new DefaultItemAnimator());//设置Item增加、移除动画

mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.HORIZONTAL_LIST));//添加分割线

适配器

private class HomeAdapter extends RecyclerView.Adapter {
private Context mContext;
private List<String> mDatas;
private LayoutInflater mInflater;

//把数据传递过来
public HomeAdapter(List<String> mDatas) {
this.mDatas = mDatas;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
mContext = parent.getContext();
mInflater = LayoutInflater.from(mContext);

//布局,添加itemview
View view = mInflater.inflate(R.layout.item_recycler, parent, false);
return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//item布局绑定数据
MyViewHolder myViewHolder = (MyViewHolder) holder;
myViewHolder.mTextView.setText(mDatas.get(position));
}

@Override
public int getItemCount() {
//大小
return mDatas.size();
}

//recyclerview的控件管理
private class MyViewHolder extends RecyclerView.ViewHolder {
TextView mTextView;
public MyViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.id_num);
}
}

}

分割线

public class ItemDivider extends RecyclerView.ItemDecoration {
private Drawable mDrawable;
private final int[] ATTRS = new int[]{
android.R.attr.listDivider//系统定义的list的分割线属性
};

public ItemDivider(Context context) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDrawable = a.getDrawable(0);//得到分割线的drawable
a.recycle();
}

public void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDrawable.getIntrinsicHeight();
mDrawable.setBounds(left, top, right, bottom);
mDrawable.draw(c);
}
}

@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
drawVertical(c, parent);
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.set(0, 0, 0, mDrawable.getIntrinsicHeight());
}

}

自定义分割线

<!-- Application theme. -->

<style name="AppTheme" parent="AppBaseTheme">

  <item name="android:listDivider">@drawable/divider_bg</item>  //在你指定的统一样式中,把系统的listdivider指向自己的divider_bg

</style>

然后自己写个drawable即可,下面我们换一种分隔符:

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android"

    android:shape="rectangle" >

    <gradient

        android:centerColor="#ff00ff00"

        android:endColor="#ff0000ff"

        android:startColor="#ffff0000"

        android:type="linear" />

    <size android:height="4dp"/>

</shape>

LayoutManager

LinearLayoutManager 现行管理器,支持横向、纵向。

GridLayoutManager 网格布局管理器

StaggeredGridLayoutManager 瀑布就式布局管理器

ItemAnimator

// 设置item动画

mRecyclerView.setItemAnimator(new DefaultItemAnimator());

注意,这里更新数据集不是用adapter.notifyDataSetChanged()而是 

notifyItemInserted(position)与notifyItemRemoved(position) 

否则没有动画效果。

上述为adapter中添加了两个方法:

public void addData(int position) {
mDatas.add(position, "Insert One");
notifyItemInserted(position);

}

public void removeData(int position) {
mDatas.remove(position);
notifyItemRemoved(position);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: