android 控件 recyclerview

来源:互联网 发布:wps输入数据自动计算 编辑:程序博客网 时间:2024/05/01 04:29

概括

你想要控制其显示的方式,请通过布局管理器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);
}
0 0
原创粉丝点击