一、RecyclerView的多种Item布局
getItemViewType()方法同ListView中的一样,在Item有多种布局时使用。在onCreateViewHolder(ViewGroup parent, int viewType) 中的第二个参数就是Item的类型,在onBindViewHolder(final ListViewAdapter.ListViewHolder holder, int position)中可以通过 holder instanceof XXXHolder来进行判断类型,来进行相应的操作.
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) {
mTitles = context.getResources().getStringArray(R.array.titles);
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 {
@InjectView(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 {
@InjectView(R.id.text_view)
TextView mTextView;
@InjectView(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());
}
});
}
}
}
二、点击事件
1)自定义点击事件接口
public interface OnClickItemListener {
void onClickItem(View view, String tag);
}
2)在适配器Adapter中设置方法
private OnClickItemListener listener;
public void setOnClickItemListener(OnClickItemListener listener) {
this.listener = listener;
}
3)在onBindViewHolder(…)中为相应的控件添加点击方法,方法中调用自定义的点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClickItem(view, (String) view.getTag());
}
});
当点击item时就会出发点击事件,就会调用自定义的onClickItem方法。
4)为adapter注册监听,通过adapter向外暴露的方法
adapter.setOnClickItemListener(new OnClickItemListener() {
@Override
public void onClickItem(View view, String tag) {
//点击后想要做的事
}
});
注意
使用RecyclerView时要在builder中添加依赖。直接添加这个就可以了。
compile ‘com.android.support:design:23.2.1’