一实现多条目
注意创建adapter时继承
RecyclerView.Adapter不能添加viewholder泛型
如下
RecyclerView.Adapter<HomeAdapter.MyViewHolder>
如果添加泛型是无法使用多个viewholder的
1重写getviewtype事件
@Override
public int getItemViewType(int position) {
return 1;
}
其中的返回值是根据你的需要返回的
2加载布局其中viewtype是你的getviewtype的返回值
根据此值来判断加载哪个item布局
@Override
public
RecyclerView.ViewHolder
onCreateViewHolder
(ViewGroup parent
, int
viewType) {
if
(viewType ==
0
) {
view
= LayoutInflater.
from
(
context
).inflate(R.layout.
item_recycler
,
parent
, false
)
;
MyViewHolder holder =
new
MyViewHolder(
view
)
;
return
holder
;
}
else
{
view
= LayoutInflater.
from
(
context
).inflate(R.layout.
item2
,
parent
, false
)
;
MyViewHolder2 holder2 =
new
MyViewHolder2(
view
)
;
return
holder2
;
}
}
3绑定赋值
根据你的getviewtype返回的值加载不同的viewholder
@Override
public void
onBindViewHolder
(RecyclerView.ViewHolder holder
, int
position) {
if
(getItemViewType(position)==
0
){
((MyViewHolder) holder).
tv
.setText(
mDatas
.get(position).getTitle())
;
// view.setOnClickListener(this);
}
else
{
((MyViewHolder2) holder).
tv2
.setText(
mDatas
.get(position).getAuthor())
;
Glide.
with
(
context
).load(
mDatas
.get(position).getPic_small()).into(((MyViewHolder2) holder).
imageView
)
;
}
// 多条目点击事件
holder.
itemView
.setTag(position)
;
holder.
itemView
.setOnClickListener(
this
)
;
}
4viewholder根据你的item写里面的findbyid只写了两个再多以此类推
class
MyViewHolder
extends
RecyclerView.ViewHolder {
TextView
tv
;
public
MyViewHolder
(View view) {
super
(view)
;
tv
= (TextView) view.findViewById(R.id.
id_num
)
;
}
}
class
MyViewHolder2
extends
RecyclerView.ViewHolder {
TextView
tv2
;
ImageView
imageView
;
public
MyViewHolder2
(View view) {
super
(view)
;
tv2
= (TextView) view.findViewById(R.id.
item2_text
)
;
imageView
= (ImageView) view.findViewById(R.id.
item2_image
)
;
}
}
二点击事件
多条目点击事件
步骤
adapter中
自定义一个继承自RecyclerView.Adapter的MyAdapter。
1.在MyAdapter中定义如下接口,模拟ListView的OnItemClickListener:
- //define interface
- public static interface OnItemClickListener {
- void onItemClick(View view , int position);
- }
-
2声明一个这个接口的变量
- private OnItemClickListener mOnItemClickListener = null;
此方法是要给适配器adapter添加接口
implements View.
OnClickListener
3将点击事件转移给外面的调用者:
@Override
- public void onClick(View v) {
- if (mOnItemClickListener != null) {
- //注意这里使用getTag方法获取position
- mOnItemClickListener.onItemClick(v,(int)v.getTag());
- }
- }
4注意上面调用接口的onItemClick()中的v.getTag()方法,这需要在onBindViewHolder()方法中设置和item的position
@Override
public void
onBindViewHolder
(RecyclerView.ViewHolder holder
, int
position) {
if
(getItemViewType(position) ==
0
) {
((MyViewHolder) holder).
tv
.setText(
mDatas
.get(position).getTitle())
;
// view.setOnClickListener(this);
}
else
{
((MyViewHolder2) holder).
tv2
.setText(
mDatas
.get(position).getAuthor())
;
Glide.
with
(
context
).load(
mDatas
.get(position).getPic_small()).into(((MyViewHolder2) holder).
imageView
)
;
}
// 多条目点击事件
holder.
itemView
.setTag(position)
;
holder.
itemView
.setOnClickListener(
this
)
;
}
5最后暴露给外面的调用者,定义一个设置Listener的方法():
- public void setOnItemClickListener(OnItemClickListener listener) {
- this.mOnItemClickListener = listener;
- }
6调用在mainactivity中
- mAdapter.setOnItemClickListener(new OnItemClickListener(){
- @Override
- public void onItemClick(View view , int position){
- Toast.makeText(MainActivity.this, data[position], 600).show();
- }
- });
完整的adapter
public class
MainAdapter
extends
XRecyclerView.Adapter
implements
View.OnClickListener {
Context
context
;
List<JsonBean.SongListBean>
mDatas
;
View
view
;
//点击事件的接口
private
OnItemClickListener
mOnItemClickListener
=
null;
public
MainAdapter
(Context context
,
List<JsonBean.SongListBean> list) {
this
.
context
= context
;
this
.
mDatas
= list
;
}
@Override
public
RecyclerView.ViewHolder
onCreateViewHolder
(ViewGroup parent
, int
viewType) {
if
(viewType ==
0
) {
view
= LayoutInflater.
from
(
context
).inflate(R.layout.
item_recycler
,
parent
, false
)
;
MyViewHolder holder =
new
MyViewHolder(
view
)
;
return
holder
;
}
else
{
view
= LayoutInflater.
from
(
context
).inflate(R.layout.
item2
,
parent
, false
)
;
MyViewHolder2 holder2 =
new
MyViewHolder2(
view
)
;
return
holder2
;
}
}
@Override
public void
onBindViewHolder
(RecyclerView.ViewHolder holder
, int
position) {
if
(getItemViewType(position) ==
0
) {
((MyViewHolder) holder).
tv
.setText(
mDatas
.get(position).getTitle())
;
// view.setOnClickListener(this);
}
else
{
((MyViewHolder2) holder).
tv2
.setText(
mDatas
.get(position).getAuthor())
;
Glide.
with
(
context
).load(
mDatas
.get(position).getPic_small()).into(((MyViewHolder2) holder).
imageView
)
;
}
// 多条目点击事件
holder.
itemView
.setTag(position)
;
holder.
itemView
.setOnClickListener(
this
)
;
}
@Override
public int
getItemCount
() {
return
mDatas
.size()
;
}
@Override
public int
getItemViewType
(
int
position) {
if
(position %
2
==
0
) {
return
0
;
}
else
{
return
1
;
}
}
class
MyViewHolder
extends
RecyclerView.ViewHolder {
TextView
tv
;
public
MyViewHolder
(View view) {
super
(view)
;
tv
= (TextView) view.findViewById(R.id.
id_num
)
;
}
}
class
MyViewHolder2
extends
RecyclerView.ViewHolder {
TextView
tv2
;
ImageView
imageView
;
public
MyViewHolder2
(View view) {
super
(view)
;
tv2
= (TextView) view.findViewById(R.id.
item2_text
)
;
imageView
= (ImageView) view.findViewById(R.id.
item2_image
)
;
}
}
public static interface
OnItemClickListener {
void
onItemClick
(View view
, int
position)
;
}
public void
setOnItemClickListener
(OnItemClickListener listener) {
this
.
mOnItemClickListener
= listener
;
}
@Override
public void
onClick
(View v) {
if
(
mOnItemClickListener
!=
null
) {
//注意这里使用getTag方法获取position
mOnItemClickListener
.onItemClick(v
,
(
int
) v.getTag())
;
}
}
}