Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在回收器视图中在两个布局之间切换_Android_Android Recyclerview - Fatal编程技术网

Android 在回收器视图中在两个布局之间切换

Android 在回收器视图中在两个布局之间切换,android,android-recyclerview,Android,Android Recyclerview,[列表布局使用recyclerview是新手,我看到了一些问题,但没有一个真正回答我的问题。我有两个布局,一个是带有文本和个人资料头像的自定义列表视图,文本和图像嵌套在与屏幕宽度匹配的cardview中。另一个是相同的内容(具有相同的ID)但在这里,图像和文本被设置为包装内容,以便它们以网格格式显示(如flash share/xender对其mainActivity的实现)。 我真正想做的是在运行时使用以下命令在这两种布局之间切换: RecyclerView.setLayoutManager(n

[列表布局使用recyclerview是新手,我看到了一些问题,但没有一个真正回答我的问题。我有两个布局,一个是带有文本和个人资料头像的自定义列表视图,文本和图像嵌套在与屏幕宽度匹配的cardview中。另一个是相同的内容(具有相同的ID)但在这里,图像和文本被设置为包装内容,以便它们以网格格式显示(如flash share/xender对其mainActivity的实现)。 我真正想做的是在运行时使用以下命令在这两种布局之间切换:

RecyclerView.setLayoutManager(new LinearLayout(this);
对于第一个布局和:

RecyclerView.setLayoutManager(new GridLayoutManager(ClassList.this, 3));
对于第二个布局,其宽度设置为包裹内容,以便在渲染时看起来更好。 以下是列表布局1:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="100dp"
card_view:cardElevation="4dp"
card_view:cardUseCompatPadding="true"
card_view:cardCornerRadius="5dp"
android:padding="5dp"
android:layout_margin="5dp"
android:foreground="?attr/selectableItemBackground">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="2dp"
    android:layout_margin="2dp"
    android:orientation="horizontal">

    <de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/student_avatar"
        android:layout_width="75dp"
        android:layout_height="75dp"
        android:layout_gravity="center"
        android:scaleType="centerCrop"
        android:src="@drawable/nothing"
        app:border_color="#FF000000" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/student_name_edit_all"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Chinedum Ofomata Agu"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <TextView
            android:id="@+id/student_reg_number_edit_all"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Reg: 2014544402"
            android:textAppearance="?android:attr/textAppearanceMedium" />

    </LinearLayout>

</LinearLayout>
</android.support.v7.widget.CardView>
我不希望两个布局同时显示,而是根据用户的选择显示某个布局。 如果您有任何建议,我们将不胜感激。
谢谢。

您应该一直使用
GridLayout
,并且
SetPansizeLookup
用于您要添加的每个项目

在你的情况下,我会让第一个项目的跨度计数为2,接下来的项目为1

RecyclerView.setLayoutManager(new GridLayoutManager(ClassList.this, 2));
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            if (position == 0) {
                return 2;
            } else {
                return 1;
            }
        }
    });

初始isList值为true

mLinearLayoutManager = new LinearLayoutManager(getActivity());
mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mGridLayourManager = new GridLayoutManager(getActivity(),3);
setLayoutManager();


private void setLayoutManager() {
        if (isList) {
            mRVList.setLayoutManager(mLinearLayoutManager);
        }else{
            mRVList.setLayoutManager(mGridLayourManager);
        }
    }
//按下列表切换按钮

isList=!isList;
setLayoutManager();
mAdapter.setList(isList);
mRVList.setAdapter(mAdapter);
适配器类更改

@Override
public AdapterRowHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(isList ? R.layout.row_layout_list : R.layout.row_layout_grid, null);
    AdapterRowHolder holder = new AdapterRowHolder(v);
    return holder;
}

好的,我明白了,但是如果我只是设置跨度大小,我只会膨胀一个布局(我的网格布局)当跨距为1时,我的网格布局项将被迫在宽度上与父项匹配,或将内容换行,并在屏幕右侧留下一个较大的空间。这不是我想要的体验。@Ahmedtalaat您可以使用视图类型解决唯一一个布局问题,为第一个项设置一个视图类型,为其余项设置一个类型。对于whi区域问题您可以获得列表的大小并查看位置是否是最后一项,然后将此项的范围设置为1,就像第一项一样。我认为方法应该是您的第一个选项(使用viewTypes)但我有两个小问题,1.我是android新手,我对回收器视图不太了解,如果你能给我一个小片段,我可以用它在我的适配器上膨胀两个视图,我将不胜感激。2.即使我膨胀了它们,我如何从我的主类(类列表)切换/切换它们因为我的onClick实现就是在这里实现的。谢谢@AhmedTalaatAlso根据我的理解,setPansizeLookup只确定要在给定行/位置显示的项目数。你找到这个问题的解决方案了吗?没有,我没有,但我现在只看了@Sibin ans,我觉得它应该可以工作。我现在有一个测试我正在练习,一旦我完成了,我会测试他的代码,如果没有,我会给你找一个补丁。谢谢重播,我找到了解决方案,请检查我的答案我也想和你一起工作。我看到了,但你不觉得使用3个RecyclerViews有点过分,重写适配器getView方法怎么样。不管怎样,Sibin是为您工作还是使用了viewFlipper修复?
mLinearLayoutManager = new LinearLayoutManager(getActivity());
mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mGridLayourManager = new GridLayoutManager(getActivity(),3);
setLayoutManager();


private void setLayoutManager() {
        if (isList) {
            mRVList.setLayoutManager(mLinearLayoutManager);
        }else{
            mRVList.setLayoutManager(mGridLayourManager);
        }
    }
isList=!isList;
setLayoutManager();
mAdapter.setList(isList);
mRVList.setAdapter(mAdapter);
@Override
public AdapterRowHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(isList ? R.layout.row_layout_list : R.layout.row_layout_grid, null);
    AdapterRowHolder holder = new AdapterRowHolder(v);
    return holder;
}