Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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-TabLayout-Fragments有时是空的_Android_Xml_Android Fragments_Tabs_Android Recyclerview - Fatal编程技术网

Android-TabLayout-Fragments有时是空的

Android-TabLayout-Fragments有时是空的,android,xml,android-fragments,tabs,android-recyclerview,Android,Xml,Android Fragments,Tabs,Android Recyclerview,我创建了一个带有选项卡式活动的应用程序。我有3个选项卡,在第一个选项卡中我添加了一个RecyclerView。一开始一切正常。但当我现在启动应用程序时,片段是空的。甚至第二个和第三个选项卡的片段也是空的,我只在其中放置了一个文本视图。这是MainActivity的代码,主要是从Android Studio生成的,我只添加了一些更改工具栏标题的代码,并更改了一些小东西: public class MainActivity extends AppCompatActivity { priva

我创建了一个带有选项卡式活动的应用程序。我有3个选项卡,在第一个选项卡中我添加了一个RecyclerView。一开始一切正常。但当我现在启动应用程序时,片段是空的。甚至第二个和第三个选项卡的片段也是空的,我只在其中放置了一个文本视图。这是MainActivity的代码,主要是从Android Studio生成的,我只添加了一些更改工具栏标题的代码,并更改了一些小东西:

public class MainActivity extends AppCompatActivity {

    private SectionsPagerAdapter mSectionsPagerAdapter;

    private ViewPager mViewPager;
    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle("Pflege");
        setSupportActionBar(toolbar);

        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);

        tabLayout.getTabAt(0).setIcon(R.drawable.tab_icon_pflege);
        tabLayout.getTabAt(1).setIcon(R.drawable.tab_icon_dokumentation);
        tabLayout.getTabAt(2).setIcon(R.drawable.tab_icon_probleme);

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                switch(tab.getPosition()) {
                    case 0:
                        mViewPager.setCurrentItem(0);
                        toolbar.setTitle("Pflege");
                        break;
                    case 1:
                        mViewPager.setCurrentItem(1);
                        toolbar.setTitle("Daten");
                        break;
                    case 2:
                        mViewPager.setCurrentItem(2);
                        toolbar.setTitle("Probleme");
                        break;
                    default:
                        mViewPager.setCurrentItem(tab.getPosition());
                        toolbar.setTitle("Pflege");
                        break;
                }
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch(position){
                case 0:
                    Tab1Pflege tab1 = new Tab1Pflege();
                    return tab1;
                case 1:
                    Tab2Dokumentation tab2 = new Tab2Dokumentation();
                    return tab2;
                case 2:
                    Tab3Probleme tab3 = new Tab3Probleme();
                    return tab3;
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "Pflege";
                case 1:
                    return "Daten";
                case 2:
                    return "Probleme";
            }
            return null;
        }
    }
}
以下是MainActivity的XML文件。我做了一些更改,选项卡将放在屏幕底部:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="eis1617.muellerkimmeyer.app.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/appbar_padding_top"
        android:theme="@style/AppTheme.AppBarOverlay"
        android:background="#3f84dd">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:layout_above="@+id/tabs" />

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:elevation="80dp"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:clickable="true"
            app:tabGravity="fill"
            app:tabIndicatorHeight="0dp"
            app:tabMode="fixed"
            app:tabBackground="@drawable/tab_color_selector"
            android:background="#3f84dd"/>

    </android.support.design.widget.AppBarLayout>

</android.support.design.widget.CoordinatorLayout>

下面是第一个选项卡的片段。它包含RecyclerView:

public class Tab1Pflege extends Fragment {

    private RecyclerView recyclerView;
    private RecyclerView.Adapter rvAdapter;
    private RecyclerView.LayoutManager rvLayoutManager;

    private ArrayList<String> listItems;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.tab1_pflege, container, false);

        listItems = new ArrayList<>();
        listItems.add("Test1");
        listItems.add("Test2");
        listItems.add("Test3");

        recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
        rvLayoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(rvLayoutManager);
        rvAdapter = new RvAdapter(listItems);
        recyclerView.setAdapter(rvAdapter);

        return rootView;
    }

}
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.MyViewHolder> {

    ArrayList<String> listItems;

    public RvAdapter (ArrayList<String> listItems){
        this.listItems = listItems;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv_item_layout, null);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {

        holder.itemTitle.setText(listItems.get(position));
        holder.itemImage.setImageResource(R.drawable.ic_keyboard_arrow_right);

    }

    @Override
    public int getItemCount() {
        return listItems.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder{

        TextView itemTitle;
        ImageView itemImage;

        public MyViewHolder(View itemView){
            super(itemView);

            itemTitle = (TextView) itemView.findViewById(R.id.itemTitle);
            itemImage = (ImageView) itemView.findViewById(R.id.itemImage);
        }

    }
}
public类Tab1Pflege扩展片段{
私人回收站;
私有RecyclerView.适配器rvAdapter;
private RecyclerView.LayoutManager rvLayoutManager;
私有ArrayList列表项;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.tab1_pflege,container,false);
listItems=new ArrayList();
添加(“测试1”);
添加(“测试2”);
添加(“测试3”);
recyclerView=(recyclerView)rootView.findViewById(R.id.recyclerView);
rvLayoutManager=新的LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(rvLayoutManager);
rvAdapter=新的rvAdapter(列表项);
recyclerView.setAdapter(rvAdapter);
返回rootView;
}
}
下面是该选项卡的XML文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="eis1617.muellerkimmeyer.app.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recyclerView"

        />

</RelativeLayout>

这里是列表项的XML文件。左侧有一个文本视图,右侧有一个图像视图:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="?attr/selectableItemBackground">

    <TextView
        android:text="TextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/itemTitle"
        android:layout_marginLeft="21dp"
        android:layout_marginStart="21dp"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:textSize="20sp" />

    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:id="@+id/itemImage"
        android:layout_marginRight="11dp"
        android:layout_marginEnd="11dp"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />
</RelativeLayout>

最后,这里是我的RecyclerView适配器类:

public class Tab1Pflege extends Fragment {

    private RecyclerView recyclerView;
    private RecyclerView.Adapter rvAdapter;
    private RecyclerView.LayoutManager rvLayoutManager;

    private ArrayList<String> listItems;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.tab1_pflege, container, false);

        listItems = new ArrayList<>();
        listItems.add("Test1");
        listItems.add("Test2");
        listItems.add("Test3");

        recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
        rvLayoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(rvLayoutManager);
        rvAdapter = new RvAdapter(listItems);
        recyclerView.setAdapter(rvAdapter);

        return rootView;
    }

}
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.MyViewHolder> {

    ArrayList<String> listItems;

    public RvAdapter (ArrayList<String> listItems){
        this.listItems = listItems;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv_item_layout, null);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {

        holder.itemTitle.setText(listItems.get(position));
        holder.itemImage.setImageResource(R.drawable.ic_keyboard_arrow_right);

    }

    @Override
    public int getItemCount() {
        return listItems.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder{

        TextView itemTitle;
        ImageView itemImage;

        public MyViewHolder(View itemView){
            super(itemView);

            itemTitle = (TextView) itemView.findViewById(R.id.itemTitle);
            itemImage = (ImageView) itemView.findViewById(R.id.itemImage);
        }

    }
}
公共类RvAdapter扩展了RecyclerView.Adapter{ ArrayList列表项; 公共RvAdapter(ArrayList listItems){ this.listItems=listItems; } @凌驾 公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){ View itemView=LayoutFlater.from(parent.getContext()).flate(R.layout.rv_item_布局,null); 返回新的MyViewHolder(itemView); } @凌驾 公共无效onBindViewHolder(MyViewHolder,最终整数位置){ holder.itemTitle.setText(listItems.get(position)); holder.itemImage.setImageResource(R.drawable.ic键盘箭头右键); } @凌驾 public int getItemCount(){ 返回listItems.size(); } 公共类MyViewHolder扩展了RecyclerView.ViewHolder{ 文本视图项目标题; 图像查看项目图像; 公共MyViewHolder(查看项目视图){ 超级(项目视图); itemTitle=(TextView)itemView.findViewById(R.id.itemTitle); itemImage=(ImageView)itemView.findViewById(R.id.itemImage); } } }
我已经尝试将MainActivity中的“extends FragmentStatePagerAdapter”替换为“extends FragmentStatePagerAdapter”。但碎片仍然是空的。有人知道有什么问题吗?有时,当我在XML文件中为列表项更改某些内容时,它会再次工作。但当我重新启动应用程序时,它不再工作了。无论是否工作,它看起来都是随机的。

如果有即时运行,请尝试禁用即时运行,并使用“清理并生成”选项运行项目。是否找到问题?我也吃同样的thing@Binev我见过的最简单的解决方案是调用setOffscreenPageLimit()方法。viewPager.setOffscreenPageLimit(3)//告诉viewpager需要在内存中保存多少片段