我想提高我的代码效率,这就是为什么我试图简化事情(请随时在 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/