1

我有RecyclerViewGridLayoutManager。我正在顯示景觀單列和景觀七列。 使用:更改RecyclerView的定位更改佈局

@Override 
    public void onConfigurationChanged(Configuration newConfig) 
    { 
     recyclerViewCalender.setLayoutManager(new GridLayoutManager(this, newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? 7 : 1)); 
     super.onConfigurationChanged(newConfig); 
    } 

但問題是用於人像的佈局不是景觀可行的。 那麼如何在配置更改時更改RecyclerView的佈局。 或者有沒有其他解決方案?

+0

你找到一個解決辦法? – Sufian

+0

@Sufian是的,請在下面查看我的答案。 – Akshay

回答

2

下面是解決方案,通過一個國旗給你Adapter描述當前的方向。

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    super.onConfigurationChanged(newConfig); 
    //Update the Flag here 
    orientationLand = (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? true : false); 
} 

在適配器類:

@Override 
public CalenderSessionHolder onCreateViewHolder(ViewGroup parent, int viewType) 
{ 
    //User Flag here to change layou 
    View itemView = LayoutInflater.from(parent.getContext()).inflate(orientationLand ? R.layout.item_calender_session_land : R.layout.item_calender_session_port, null); 
    return new CalenderSessionHolder(itemView); 
} 

確保您處理視圖ID的正確,以避免例外。

更新:

如果你有兩個View持有人:

@Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    { 
     if (orientationLand) 
     { 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_calender_session_land , parent, false); 
      return new LandViewHolder(v); 
     } 
     else 
     { 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_calender_session_port, parent, false); 
      return new PortViewHolder(v); 
     } 
     return null; 
    } 

在綁定ViewHolder

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 
{ 
    if (holder instanceof PortViewHolder) 
    { 
     PortViewHolder portHolder = (PortViewHolder) holder; 
     //Initialize Views here for Port View 
    } else if (holder instanceof LandViewHolder) 
    { 
     LandViewHolder landViewHolder = (LandViewHolder) holder; 
     //Initialize Views here for Land View 
    } 
} 
+0

這樣做可以正常工作,但如果有人像我一樣使Activity在循環中不可銷燬,則需要定義兩個'ViewHolder'(一個用於端口和其他地方)。否則,一些項目將遵循舊的方向,而其他項目將會處於當前的方向。 – Sufian

+0

@Sufian請檢查你的問題已更新的答案。希望它能爲你工作.. :) – Akshay

+0

不,我所做的是爲每個方向創建單獨的ViewHolders,比如'ViewHolderPort'和'ViewHolderLand'。然後,如果方向是縱向,我將從'getItemViewType()'返回不同的縱向和橫向值。這樣做會迫使適配器在調用'notifyDataSetChanged()'時創建一個新的ViewHolder。你的原始解決方案非常接近我實際做的。 :) – Sufian