Search code examples
androidspinnerandroid-arrayadapterandroid-buttonandroid-adapterview

Struggling to replace SPINNER with BUTTONS populated from database


Trying to replace spinner with buttons dynamically populated from database. Normally spinner use array adapter and built-in List Item Layouts "android.R.layout.simple_spinner_item"etc.

How should it be modified if instead of spinner you want to populate buttons?

Should I replace layouts for spinner in my in loadDifficulties() method with layouts for buttons?

HERE HOW IT WORKED WITH SPINNER

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_starting_screen);
spinnerDifficulty = findViewById(R.id.spinner_quizlist);
loadDifficulties();
Button startTest = findViewById(R.id.start_test);
startTest.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        startQuiz();
    }
});
}
private void startQuiz() {
ListQuiz selectedLevel = (ListQuiz) spinnerDifficulty.getSelectedItem();
int LevelListID = selectedLevel.getId();
String quizListName = selectedLevel.getName();
Intent intent = new Intent(StartingScreenActivity.this, MainActivity.class);
intent.putExtra(EXTRA_DIFFICULTY_ID, LevelListID);
intent.putExtra(EXTRA_DIFFICULTY_NAME, quizListName);
startActivityForResult(intent, REQUEST_CODE_QUIZ);
}
private void loadDifficulties(){
QuizDbHelper dbHelper = QuizDbHelper.getInstance(this);
List<ListQuiz> LevelList = dbHelper.getAllListQuiz();
ArrayAdapter<ListQuiz> adapterLevelList = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, LevelList);    adapterLevelList.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerDifficulty.setAdapter(adapterLevelList);
}

Solution

  • Briefly

    • Created LinearLayout for buttons.
    • I didn't need to use ArrayAdapter in the loadDifficulties anymore.
    • Added all needed parameters to startQuiz() (in my case int & String) simplifying method to Intents only.

      private ArrayAdapter <ListQuiz> adapter;
      private  Button autobutton;
      public int categorySize;
      private List<ListQuiz> categoryName;
      private LinearLayout QuizListLayout;
      private  Button levelButton;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_starting_screen);
      autobutton = findViewById(R.id.autobutton);
      loadDifficulties();
      
      QuizListLayout = findViewById(R.id.layoutForButtons);
      for(int i=0; i<categorySize;i++){
      
          levelButton =new Button(this);
          levelButton.setText("" + categoryName.get(i));
          levelButton.setId(i);
          final int index = i;
          levelButton.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
          levelButton.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  startQuiz(v.getId(), categoryName.get(index).toString());
              }
          });
          QuizListLayout.addView(levelButton);
      }
      }
      
      
      private void startQuiz(int LevelListID, String quizListName) {
      Intent intent = new Intent(StartingScreenActivity.this, MainActivity.class);
      intent.putExtra(EXTRA_DIFFICULTY_ID, LevelListID);
      intent.putExtra(EXTRA_DIFFICULTY_NAME, quizListName);
      startActivityForResult(intent, REQUEST_CODE_QUIZ);
      }
      
      private void loadDifficulties(){
      QuizDbHelper dbHelper = QuizDbHelper.getInstance(this);
      List<ListQuiz> LevelList = dbHelper.getAllListQuiz();
      categorySize = dbHelper.getAllListQuiz().size(); 
      categoryName = dbHelper.getAllListQuiz();  
      

    buttonlayout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/layoutForButtons">
    </LinearLayout>