java - 包含 ListView 的动态导航选项卡数量

标签 java android android-fragments kotlin fragment

我想提高我的代码效率,这就是为什么我试图简化事情(请随时在 KOTLIN 中帮助我)

这是关于一个餐厅预订系统,我有 2 个大房间,每个房间都有一定数量的 table (=我的配置中的硬编码数字)。 我试图为每个表获取一个选项卡,其中每个选项卡都包含一个 ListView,它通过 SQLite DB 获取他的信息。

我目前正在做的是,每个房间都有 2 个独立的登陆页面,并且对于每个 table ,我都编写了一个选项卡。这当然不是正确的方法,但是,是的,这就是为什么我在这里寻求您的帮助:

主页使用SectionsPageAdapter进行 fragment 处理,正如您所看到的,我已经实现了包含“Room 1”或“Room 2”的“currentLocation”字符串。

  private SectionsPageAdapter mSectionsPageAdapter;
    private ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_landing_one);

        Intent mIntent = getIntent();
        Bundle extras = mIntent.getExtras();
        final String currentLocation = extras.getString("currentLocation");


        mSectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter
        mViewPager = (ViewPager) findViewById(R.id.container);
        setupViewPager(mViewPager);

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

    }



    private void setupViewPager (ViewPager viewPager) {
        SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager());


        if(currentLocation.equals(config.roomone) {
        // for loop?
        adapter.addFragment(new table_new_main(),"INFO");
        adapter.addFragment(new table_one(),"TABLE 1"); 
        adapter.addFragment(new table_two(),"TABLE 2");
        adapter.addFragment(new table_three(),"TABLE 3");
} else { ... }


        viewPager.setAdapter(adapter);

    }
}

问题1

if 循环做了他的事情,现在我如何根据给定的表数量设置动态的 fragment 数量?用for循环?

现在是 fragment (这是我陷入困境的棘手部分):

公共(public)类 table_one 扩展 Fragment {

private ListView roomlist;
ListAdapter JSON_List;
ArrayList<String> Array_dates;
ArrayList<String> Array_table,Array_dayid,Array_location;
String currentLocation;



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


    roomlist = (ListView) view.findViewById(R.id.list_table);


    String id = config.ID_table3; // I hardcoded each table number, how can I pass that through my landing page to get it here?
    AppDatabase db = Room.databaseBuilder(getContext(),
            AppDatabase.class, config.DB_TABLES).allowMainThreadQueries().build();
    Array_dates = new ArrayList<String>();
    Array_table = new ArrayList<String>();
    Array_dayid = new ArrayList<String>();
    Array_location = new ArrayList<>();
    for(int i=0;i<value.size();i++) {
        Array_dates.add(value.get(i).getDaysDate());
        Array_table.add(value.get(i).getDaysPRX());
        Array_dayid.add(value.get(i).getDayid());
        Array_location.add(value.get(i).getLocation_id());
    }


    JSON_List = new RoomListAdapter(getContext(),id,Array_dates,null,null,Array_table,null,Array_dayid,Array_location,currentLocation);

    roomlist.setAdapter(JSON_List);
    return view;



}

问题 2

所以我需要传递给每个 fragment :currentLocation(Room 1/2)和它本身的table_id,以了解从数据库中获取数据的位置。 我怎样才能做到这一点?

最佳答案

这绝不是您问题的全面答案,但您绝对可以优化它:

 private void setupViewPager (ViewPager viewPager) {
        SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager());


        if(currentLocation.equals(config.roomone) {
        // for loop?
        adapter.addFragment(new table_new_main(),"INFO");
        adapter.addFragment(new table_one(),"TABLE 1"); 
        adapter.addFragment(new table_two(),"TABLE 2");
        adapter.addFragment(new table_three(),"TABLE 3");
    } else { ... }


        viewPager.setAdapter(adapter);

    }

通过一系列 fragment ,大致如下:

    ArrayList<Fragment> listOfTables = new ArrayList<>();

    listOfTables.add(new example1()); 
    listOfTables.add(new example2()); 
    ...

因此,在这里,您可以提前将所有表格 fragment 填充到一个列表中,然后根据您拥有的配置(您的 if 语句)

您可以循环浏览现有的 fragment 列表,然后根据需要将它们添加到适配器中:

    for (int i = 0; i < SomeValueHere; i++) { //you might even try reading this value from your config
        yourAdapter.add(listOfFragment.get(i));
    }

对于你的第二个问题,你是说你想将一些值传递给 fragment 。

嗯,你总是可以尝试这样的事情:

    for (int i = 0; i < SomeValueHere; i++) { //you should try reading this value from your config if can , perhaps
     Fragment table = listOfFragment.get(i);

     Bundle tableInfo = new Bundle();//add a bundle to the fragment with some extra details
     tableInfo.putInt("room_config", SomeIndicatorHereToShowWhichConfigIsChosen);
     tableInfo.putInt("table_id", i);

     table.setArguments(tableInfo);
        yourAdapter.add(table);
    }

然后,从您的 fragment 中,您可以执行以下操作:

       @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    Bundle extras = getArguments();

    if (extras == null) {
   //maybe throw an exception, as this should never happen
    } else {
      Integer roomConfig = extras.getInt("room_config");
      Integer roomId = extras.getInt("room_id");
    }

}

关于java - 包含 ListView 的动态导航选项卡数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58324352/

相关文章:

java - java中的合并排序实现是将一个值复制到另一个索引中而不是交换

java - 不使用 SurfaceHolder 获取屏幕宽度

android - 在不同 Activity 中的 Fragment 之间共享 ViewModel

java - 使用 getExtra() - NullPointerException

java - 绑定(bind)到 c# 一些使用 .so 库的 java 代码

java - 我有一个将值存储到 double[][] 实例变量中的构造函数。我想在我的主函数中使用双数组作为变量

android - 将改造错误作为 gson 模型处理

android - 我没有找到ID的 View … fragment YouTubePlayerSupportFragment,它关闭了我的应用程序

java - WSO2 API Manager安装无法运行Java

android - 应用程序关闭后,WorkManager 停止调度周期性 Worker