Динамическое количество вкладок навигации с ListView в них - PullRequest
0 голосов
/ 10 октября 2019

Я хочу быть более эффективным с моим кодом, поэтому я пытаюсь упростить вещи (не стесняйтесь помочь мне в KOTLIN )

Это о системе бронирования ресторанагде у меня 2 большие комнаты, в каждой комнате есть определенное количество таблиц (= жестко закодированное число в моей конфигурации). Я пытаюсь получить одну вкладку для каждой таблицы, где каждая вкладка содержит ListView, который получает его информацию от БД SQLite.

В настоящее время я делаю, что у меня есть две отдельные целевые страницы для каждой комнатыи для каждой таблицы я кодировал Tab. Это, конечно, не способ сделать это, но да, поэтому я здесь и прошу вашей помощи:

Главная страница выполняет обработку фрагментов с помощью SectionsPageAdapter, как вы можете видеть, что я уже реализовал "currentLocation "Строка, содержащая" Комната 1 "или" Комната 2 ".

  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 делает свое дело, теперь, как я могу установитьдинамическое количество фрагментов на основе заданного количества таблиц? С циклом for?

Теперь фрагменты (это сложная часть, где я застрял):

открытый класс 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

Поэтому мне нужно перейти к каждому фрагменту: currentLocation (комната 1/2) и саму table_id, чтобы узнать, где взять данные из моей базы данных. Как я могу это сделать?

1 Ответ

2 голосов
/ 10 октября 2019

Это ни в коем случае не исчерпывающий ответ на ваш вопрос, но вы определенно можете оптимизировать это:

 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);

    }

С массивом фрагментов, что-то вроде этого:

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

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

поэтому здесь вы можете заранее заполнить все фрагменты таблицы в один список, а затем на основе имеющейся у вас конфигурации (ваше заявление if)

вы можете циклически перебирать существующий список фрагментов ипросто добавьте их по мере необходимости в адаптер:

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

для вашего второго вопроса, вы говорите, что хотите передать некоторые значения во фрагменты.

Ну, вы всегда можете попробовать что-то вроде этого:

    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);
    }

Затем из вашего фрагмента вы можете сделать что-то вроде этого:

       @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");
    }

}
...