前言
在 Android 开发中会经常用到 RecyclerView , 当 RecyclerView 的 item 类型有多种时,我们需要重写 getItemViewType 方法。
1 2 3 4
| @Override public int getItemViewType(int i) { return 0; }
|
getItemViewType 方法指定返回一个 int 值,如果我们需要返回多个值怎么办?
场景
当我们做 IM 的聊天消息展示时,可能会有 state 代表消息状态(接收的已读消息、接收的未读消息、发送成功的消息、发送失败的消息),type 代表消息类型(文字、图片、视频、音频)。此时,我们可能需要 getItemViewType 返回 state 和 type 两个值。
1 2 3 4 5 6 7
| @Override public int getItemViewType(int i) { int state = mMessageList.get(i).state; int type = mMessageList.get(i).type;
return 0; }
|
解决方法
一个 int 类型有 32 位,我们用左边的高 16 位存储 state 的值,用右边的低 16 位存储 type 的值
1 2 3 4 5 6 7 8 9 10
| @Override public int getItemViewType(int i) { int state = mMessageList.get(i).state; int type = mMessageList.get(i).type;
int result = (state & 0x7fff) << 16; result |= (type & 0x7fff);
return result; }
|
在 onCreateViewHolder 中通过 viewType 解析出 state 和 type .
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Override public AbstractChatHolder onCreateViewHolder(ViewGroup parent, int viewType) { ViewHolder viewHolder;
int type = viewType & 0x7fff; int state = (viewType >> 16) & 0x7fff;
return viewHolder; }
|
注意点
- state 和 type 的取值范围都是 [0,32767],即最小值为 0,最大值为 32767(十六进制的 0x7fff),因为它们实际各占 15 位