2017-04-06 34 views
0

我想在沒有條款顯示和我所做的是增加另一個viewType顯示一個「空狀態」觀點:項目爲RecyclerView的空狀態沒有顯示

private static final int ITEM = 0; 
private static final int LOADING = 1; 
private static final int EMPTY_STATE = 2; 

@Override 
public int getItemCount() { 
    return dataset == null ? 1 : dataset.size(); 
} 

@Override 
public int getItemViewType(int position) { 
    if (dataset == null) { 
     return EMPTY_STATE; 
    } else if (position == dataset.size() - 1 && isLoadingAdded) { 
     return LOADING; 
    } else { 
     return ITEM; 
    } 
} 

如果數據集== NULL ,我正在返回Empty State的視圖。

我還添加了相應的代碼:

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    RecyclerView.ViewHolder viewHolder = null; 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 

    switch (viewType) { 
     case ITEM: 
      viewHolder = getFeedItemViewHolder(parent, inflater); 
      break; 
     case LOADING: 
      viewHolder = new LoadingVH(inflater.inflate(R.layout.item_loading, parent, false)); 
      break; 
     case EMPTY_STATE: 
      viewHolder = new EmptyStateVH(inflater.inflate(R.layout.textview_first_time_text, parent, false)); 
      break; 
    } 
    return viewHolder; 
} 

onBindViewHolder

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { 

    switch (getItemViewType(position)) { 
     case ITEM: 
      // code here... 
      break; 
     case EMPTY_STATE: 
      final EmptyStateVH emptyStateVH = (EmptyStateVH) holder; 
      break; 
    } 
} 

但上面的代碼是行不通的。不應該用空數據集返回一個EMPTY_VIEW?邏輯錯誤,我應該找到另一種方法來做到這一點?我想要避免的是將邏輯移動到Activity,在那裏我將有一個FrameLayout,帶有不可見的重疊視圖以顯示空狀態,當沒有項目時我會將可見性更改爲VISIBLE。我想避免它,因爲我有一個MainActivity和許多Fragment s,我想爲每個使用不同的空狀態。

謝謝!

+2

有沒有可能'dataset'不爲空,但空(因此dataset.size()返回0) ? – MatusMak

+0

那是正確的!我的錯誤:/感謝您的幫助。如果你想添加它作爲答案,我會接受它 – Mes

+0

答案與解釋和建議的修復補充:) – MatusMak

回答

2

不足之處的接縫在這裏:

@Override 
public int getItemCount() { 
    return dataset == null ? 1 : dataset.size(); 
} 

如果數據集不爲空,但只有空(dataset.size()== 0),這基本上會破壞你的代碼。小修補程序將阻止這種情況的發生:

@Override 
public int getItemCount() { 
    return (dataset == null || dataset.isEmpty()) ? 1 : dataset.size(); 
} 
0

試試這個:

private static final int ITEM = 0; 
private static final int LOADING = 1; 
private static final int EMPTY_STATE = 2; 

@Override 
public int getItemCount() { 
    return dataset.size() == 0? 1 : dataset.size(); 
} 

@Override 
public int getItemViewType(int position) { 
    if (dataset.size() == 0) { 
     return EMPTY_STATE; 
    } else if (position == dataset.size() - 1 && isLoadingAdded) { 
     return LOADING; 
    } else { 
     return ITEM; 
    } 
}