RecyclerView是android-support-v7-21版本中新增的一个Widget,官方介绍RecyclerView 是 ListView 的升级版本,更加先进和灵活。
查看ViewHolder重写方法时,发现有意思的地方。创建ViewHolder时,调用RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType),只是知道调用这个方法,创建ViewHolder,但是对第二个参数置之不理,也不知道这个参数的意思。在ViewHolder重写的方法中,有这么个方法,
int getItemViewType(int position),默认的返回值为0。现在才知道onCreateViewHolder方法中参数是在这里获取到的,表示某个条目的类型。尝试在这里做下处理,看看能不能达到想要的效果。还真出现了意外的惊喜,空数据提示实现了。
- private static final int VIEW_TYPE = -1;
- /**
- * 获取条目 View填充的类型
- * 默认返回0
- * 将lists为空返回-1
- * @param position
- * @return
- */
- public int getItemViewType(int position) {
- if (lists.size() <= 0) {
- return VIEW_TYPE;
- }
- return super.getItemViewType(position);
- }
- * 创建ViewHolder
- * @param viewGroup
- * @param viewType
- * @return
- */
- public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
- View view;
- LayoutInflater inflater = LayoutInflater.from(context);
- if (VIEW_TYPE == viewType) {
- view = inflater.inflate(R.layout.item_empty, viewGroup, false);
- return new MyEmptyHolder(view);
- }
- view = inflater.inflate(R.layout.item_test, viewGroup, false);
- return new MyHolder(view);
- }
- /**
- * 将数据绑定到ViewHolder上
- * @param viewHolder
- * @param position
- */
- public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
- if (viewHolder instanceof MyHolder) {
- ((MyHolder) viewHolder).tv_test.setText(lists.get(position));
- }
- }
* 创建ViewHolder
* @param viewGroup
* @param viewType
* @return
*/
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View view;
LayoutInflater inflater = LayoutInflater.from(context);
if (VIEW_TYPE == viewType) {
view = inflater.inflate(R.layout.item_empty, viewGroup, false);
return new MyEmptyHolder(view);
}
view = inflater.inflate(R.layout.item_test, viewGroup, false);
return new MyHolder(view);
}
/**
* 将数据绑定到ViewHolder上
* @param viewHolder
* @param position
*/
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
if (viewHolder instanceof MyHolder) {
((MyHolder) viewHolder).tv_test.setText(lists.get(position));
}
}
在调用int getItemCount() ,获取条目数量时,我们习惯这么写return lists.size <= 0 ? 0 : lists.size(); 如果这么写,空数据提示,依然没显示出来。如果这样写,表示空数据时,条目数量为0。需要改成 return
lists.size() > 0 ? lists.size() : 1;表示即使空数据,也显示一条条目。