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

android RecyclerView的使用

2016-07-11 14:52 671 查看
RecyclerView是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视图缓.

首先要用这个控件,你需要在gradle文件中添加包的引用

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


然后是在XML文件用使用它

<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler_view"/>

接着在Activity中设置它

mRecyclerView.setLayoutManager(new LinearLayoutManager(this));//线性显示 类似于listview
//mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));//线性宫格显示 类似于GridView
//mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL));//线性宫格显示 类似于瀑布流
mRecyclerView.setAdapter(new NormalRecyclerViewAdapter(this));


然后是适配器

public class NormalRecyclerViewAdapter extends RecyclerView.Adapter<NormalRecyclerViewAdapter.NormalTextViewHolder> {
private final LayoutInflater mLayoutInflater;
private final Context mContext;
private String[] mTitles;

public NormalRecyclerViewAdapter(Context context, String[] title) {
mTitles = title;
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
}

@Override
public NormalTextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new NormalTextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
}

@Override
public void onBindViewHolder(NormalTextViewHolder holder, int position) {
holder.mTextView.setText(mTitles[position]);
}

@Override
public int getItemCount() {
return mTitles == null ? 0 : mTitles.length;
}

public static class NormalTextViewHolder extends RecyclerView.ViewHolder {
@Bind(R.id.text_view)
TextView mTextView;

NormalTextViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("NormalTextViewHolder", "onClick--> position = " + getPosition());
}
});
}
}
}


*设置item之间的距离
public class SpaceItemDecoration extends RecyclerView.ItemDecoration {

int space;

public SpaceItemDecoration(int s){

this.space = s;

}

@Override

public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

super.getItemOffsets(outRect, view, parent, state);

if(parent.getChildLayoutPosition(view)!=0){

outRect.top = space;

}

}

}

在程序中调用:

mRvDisplay.addItemDecoration(new SpaceItemDecoration(15));//设置item间距

*设置不同布局的item

public class MultipleItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static enum ITEM_TYPE {
ITEM_TYPE_IMAGE,
ITEM_TYPE_TEXT
}

private final LayoutInflater mLayoutInflater;
private final Context mContext;
private String[] mTitles;

public MultipleItemAdapter(Context context, String[] title) {
mTitles = title;
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal()) {
return new ImageViewHolder(mLayoutInflater.inflate(R.layout.item_image, parent, false));
} else {
return new TextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
}
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof TextViewHolder) {
((TextViewHolder) holder).mTextView.setText(mTitles[position]);
} else if (holder instanceof ImageViewHolder) {
((ImageViewHolder) holder).mTextView.setText(mTitles[position]);
}
}

@Override
public int getItemViewType(int position) {
return position % 2 == 0 ? ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal() : ITEM_TYPE.ITEM_TYPE_TEXT.ordinal();
}

@Override
public int getItemCount() {
return mTitles == null ? 0 : mTitles.length;
}

public static class TextViewHolder extends RecyclerView.ViewHolder {
@Bind(R.id.text_view)
TextView mTextView;

TextViewHolder(View view) {
super(view);
ButterKnife.inject(this, view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TextViewHolder", "onClick--> position = " + getPosition());
}
});
}
}

public static class ImageViewHolder extends RecyclerView.ViewHolder {
@Bind(R.id.text_view)
TextView mTextView;
@Bind(R.id.image_view)
ImageView mImageView;

ImageViewHolder(View view) {
super(view);
ButterKnife.inject(this, view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("ImageViewHolder", "onClick--> position = " + getPosition());
}
});
}
}
}[/code]

设置分割线

public class MyItemDecoration extends RecyclerView.ItemDecoration
{
private static final int[] ATTRS = {android.R.attr.listDivider};
private Drawable mDivider;
public MyItemDecoration(Context context)
{
TypedArray array = context.obtainStyledAttributes(ATTRS);
// 获取分隔条
[/code]
mDivider = context.getResources().getDrawable(R.drawable.divider);

array.recycle();
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state)
{
super.onDrawOver(c, parent, state);
int count = parent.getChildCount();
int left = parent.getPaddingLeft();
int right = parent.getWidth()-parent.getPaddingRight();
for(int i = 0; i < count; i++)
{
View v = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) v.getLayoutParams();
int top = v.getBottom() + params.bottomMargin;
int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left,top,right,bottom);
mDivider.draw(c);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: