Android 更改RecyclerView';改变方向时的布局

Android 更改RecyclerView';改变方向时的布局,android,android-recyclerview,android-orientation,gridlayoutmanager,Android,Android Recyclerview,Android Orientation,Gridlayoutmanager,我正在使用GridLayoutManager进行RecyclerView。我显示的是单栏横向和七栏横向。 使用: 但问题是用于肖像的布局对于景观来说是不可行的。 那么,如何在配置更改时更改RecyclerView的布局呢。 或者是否有其他解决方案???这是解决方案,请向您传递一个描述当前方向的标志 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationCha

我正在使用
GridLayoutManager
进行
RecyclerView
。我显示的是单栏横向和七栏横向。 使用:

但问题是用于肖像的布局对于景观来说是不可行的。 那么,如何在配置更改时更改
RecyclerView
的布局呢。
或者是否有其他解决方案???

这是解决方案,请向您传递一个描述当前方向的标志

@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以避免异常

更新:

如果您有两个视图保持架:

@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;
    }
内绑定视图持有者

@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
    }
}

你找到解决方案了吗?@Sufian是的,请检查我下面的答案。这很好,但如果有人,像我一样,在旋转时使活动不可中断,则需要定义两个
视图持有者
s(一个用于港口,另一个用于陆地)。否则,某些项目将遵循旧方向,而其他项目将遵循当前方向。@Sufian请为您的问题检查更新的答案。。希望它对您有用。:)不,我所做的是为每个方向创建单独的视图持有者,如
ViewHolderPort
ViewHolderLand
。然后,如果方向是纵向,我将从
getItemViewType()
返回纵向和横向的不同值。这样做将迫使适配器在调用
notifyDataSetChanged()
时创建新的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
    }
}