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