Skip to content Skip to sidebar Skip to footer

Widget Atas Posting

Cara Membuat Aplikasi Quiz Menggunakan Android Studio dengan Database SQLite

maswijaba.my.id

maswijaba.my.id - Assalamualaikum wr.wb. Puji syukur kita bisa dipertemukan lagi di kesempatan kali ini, semoga semuanya sehat-sehat ya. Pada kesempatan kali ini saya akan membahas bagaimana Cara Membuat Aplikasi Quiz Menggunakan Android Studio dengan Database SQLite.



Tutorial sederhana ini dirasa bisa membantu kalian untuk membuat aplikasi Android, walaupun tidak sempurna dan bisa dikatakan sederhana mudah-mudahan bermanfaat untuk kalian yang ingin belajar tentang Android.

Tutorial sederhana kali ini untuk soalnya sebagian saya ambil contohnya dari aplikasi ruangguru di playstore ya. Yamemang fitur yang ada tidak sama seperti aplikasi ruangguru, tapi diharapkan aplikasi ini dapat dikembangkan agar menjadi lebih profesional lagi kedepannya.

Aplikasi ini sangat disarankan untuk membuat tugas Android sebagai referensi kalian untuk tugas-tugas mobile, buat tugas akhir atau skripsi juga tidak apa-apa asalkan kalian memperbaharuinya (tambahkan yang belum ada).

Langsung saja kita masuk ke cara pengaplikasiannya dengan mengikuti step-step di bawah ini.

1. Buat Project Baru di Android Studio

Klik File - Project Baru. Ketika diminta untuk memilih Default Activity, kita memilih Empty Activity dan klik Next. (Untuk minSDK, saya set API 21)

2. Selanjutnya kalian buat activity_dashboard.xml untuk tampilan dari menu utamanya. Lalu masukan skrip dibawah ini.

<?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"
    android:fitsSystemWindows="true"
    tools:context=".DashboardActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appBar"
        android:layout_width="match_parent"
        android:layout_height="260dp"
        android:fitsSystemWindows="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsingToolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:fitsSystemWindows="true"
                app:layout_collapseMode="pin"
                app:layout_scrollFlags="scroll|enterAlways"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:title="@string/category" />

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

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

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false"
            android:orientation="vertical">

            <GridView
                android:id="@+id/categories_list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:gravity="center"
                android:numColumns="2"
                android:scrollbars="vertical" />

        </LinearLayout>

    </android.support.v4.widget.NestedScrollView>

    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/dimen_16dp"
        android:id="@+id/fab_share"
        android:src="@drawable/ic_share"
        app:layout_anchor="@id/appBar"
        app:layout_anchorGravity="bottom|end" />

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

3. Buat activity_question.xml untuk menampilkan menu soal-soalnya, lalu masukan skripnya.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:id="@+id/question_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="@dimen/dimen_4dp"
    tools:context=".QuestionActivity">

    <TextView
        android:id="@+id/score"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="8dp"
        android:textAllCaps="false"
        android:textAppearance="@android:style/TextAppearance.Material.Medium"
        android:textColor="@android:color/black"
        app:layout_constraintBottom_toTopOf="@+id/recyclerView"
        app:layout_constraintEnd_toEndOf="@+id/recyclerView"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Score: x/x" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="4dp"
        android:layout_marginTop="4dp"
        android:layout_marginEnd="4dp"
        android:layout_marginBottom="4dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/score" />

    <TextView
        android:id="@+id/remaining_questions"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:textAllCaps="false"
        android:textAppearance="@android:style/TextAppearance.Material.Medium"
        android:textColor="@android:color/black"
        app:layout_constraintBottom_toTopOf="@+id/recyclerView"
        app:layout_constraintEnd_toStartOf="@+id/score"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Remaining: x" />

</android.support.constraint.ConstraintLayout>

4. Kita buat grid_view_item.xml sebagai isi dari activity_dashboard diatas yang menampilkan soal.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    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="wrap_content"
    android:layout_height="wrap_content">

    <android.support.v7.widget.CardView
        app:cardCornerRadius="@dimen/dimen_8dp"
        app:cardElevation="@dimen/dimen_4dp"
        app:cardUseCompatPadding="true"
        android:id="@+id/cardView"
        android:layout_width="160dp"
        android:layout_height="160dp"
        android:clickable="true"
        android:foreground="?android:attr/selectableItemBackground"
        tools:ignore="MissingConstraints">

    <ImageView
        android:id="@+id/category_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:src="@tools:sample/avatars"
        android:clickable="true"
        android:focusable="true"
        android:foreground="?selectableItemBackgroundBorderless"
        />

    <TextView
        android:id="@+id/category_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:textColor="@android:color/white"
        android:layout_margin="@dimen/dimen_16dp"
        android:textAppearance="?android:textAppearanceMedium"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.5"
        tools:text="Category" />

    </android.support.v7.widget.CardView>

</android.support.constraint.ConstraintLayout>

5. Kemudian buat question_card_layout.xml sebagai isi dari activity_question yang akan menampilkan soal-soal beserta jawabannya.

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView 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="wrap_content"
    android:alpha="0.7"
    app:cardCornerRadius="@dimen/dimen_8dp"
    app:cardElevation="@dimen/dimen_4dp"
    app:cardUseCompatPadding="true">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/question"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginStart="16dp"
            android:layout_marginTop="16dp"
            android:layout_marginEnd="16dp"
            android:textAppearance="?android:textAppearanceMedium"
            android:textColor="@android:color/black"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:text="TextView" />

        <com.azhar.quizsqlite.ToggleButtonGroupTableLayout
            android:id="@+id/table_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginBottom="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/question">

            <TableRow>

                <RadioButton
                    android:id="@+id/rb1"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_margin="@dimen/dimen_16dp"
                    android:layout_weight="1"
                    android:background="@drawable/button_background"
                    android:button="@android:color/transparent"
                    android:gravity="center"
                    android:padding="@dimen/dimen_16dp"
                    tools:text="Button1" />

                <RadioButton
                    android:id="@+id/rb2"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_margin="@dimen/dimen_16dp"
                    android:layout_weight="1"
                    android:background="@drawable/button_background"
                    android:button="@android:color/transparent"
                    android:gravity="center"
                    android:padding="@dimen/dimen_16dp"
                    tools:text="Button2" />

            </TableRow>

            <TableRow>

                <RadioButton
                    android:id="@+id/rb3"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_margin="@dimen/dimen_16dp"
                    android:layout_weight="1"
                    android:background="@drawable/button_background"
                    android:button="@android:color/transparent"
                    android:gravity="center"
                    android:padding="@dimen/dimen_16dp"
                    tools:text="Button3" />

                <RadioButton
                    android:id="@+id/rb4"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_margin="@dimen/dimen_16dp"
                    android:layout_weight="1"
                    android:background="@drawable/button_background"
                    android:button="@android:color/transparent"
                    android:gravity="center"
                    android:padding="@dimen/dimen_16dp"
                    tools:text="Button4" />

            </TableRow>

        </com.azhar.quizsqlite.ToggleButtonGroupTableLayout>

    </android.support.constraint.ConstraintLayout>

</android.support.v7.widget.CardView>

6. Sekarang kita buat CategoryAdapter.java untuk menyediakan kategori soal-soal. Dan CategoryItem.java yang menseleksi warna dan kategori soalnya.

CategoryAdapter.java
package com.azhar.quizsqlite;

import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class CategoryAdapter extends ArrayAdapter<CategoryItem> {

    static final String CATEGORY_COLOR = "CategoryColor";
    static final String CATEGORY_ID = "CategoryID";
    private Context mContext;
    private ArrayList<CategoryItem> mCategoryItems;

    CategoryAdapter(@NonNull Context context, int resource, @NonNull ArrayList<CategoryItem> categoryItems) {
        super(context, resource, categoryItems);
        this.mContext = context;
        this.mCategoryItems = categoryItems;
    }

    @Override
    public int getCount() {
        return super.getCount();
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

        CategoryViewHolder categoryViewHolder;
        final CategoryItem categoryItem = mCategoryItems.get(position);

        if (convertView == null) {
            convertView = LayoutInflater.from(mContext)
            .inflate(R.layout.grid_view_item, parent, false);
            categoryViewHolder = new CategoryViewHolder(convertView);
            convertView.setTag(categoryViewHolder);
        }
        categoryViewHolder = (CategoryViewHolder) convertView.getTag();
        categoryViewHolder.categoryImage.setBackgroundColor(categoryItem.getmBgColor());
        categoryViewHolder.categoryTitle.setText(categoryItem.getmCategoryTitle());
        categoryViewHolder.categoryImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent questionIntent = new Intent(mContext, QuestionActivity.class);
                questionIntent.putExtra(CATEGORY_ID, categoryItem.getmCategoryID());
                questionIntent.putExtra(CATEGORY_COLOR, categoryItem.getmBgColor());
                mContext.startActivity(questionIntent);
            }
        });
        return convertView;
    }

    static class CategoryViewHolder extends RecyclerView.ViewHolder {

        ImageView categoryImage;
        TextView categoryTitle;

        CategoryViewHolder(View itemView) {
            super(itemView);
            categoryImage = itemView.findViewById(R.id.category_image);
            categoryTitle = itemView.findViewById(R.id.category_title);
        }
    }
}
CategoryItem.java
package com.azhar.quizsqlite;

public class CategoryItem {

    private int mBgColor;
    private String mCategoryTitle;
    private String mCategoryID;

    CategoryItem(int imageId, String categoryTitle, String categoryID) {
        this.mBgColor = imageId;
        this.mCategoryTitle = categoryTitle;
        this.mCategoryID = categoryID;
    }

    public int getmBgColor() {
        return mBgColor;
    }

    public String getmCategoryTitle() {
        return mCategoryTitle;
    }

    public String getmCategoryID() {
        return mCategoryID;
    }
}

7. Selanjutnya kita buat DashboardActivity.java yang berfungsi menampilkan kategori activity_dashboard.xml yang tadi telah kita buat diatas.

package com.azhar.quizsqlite;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.GridView;

import java.util.ArrayList;

public class DashboardActivity extends AppCompatActivity {

    private GridView mGridView;
    private CategoryAdapter mCategoryAdapter;
    private ArrayList<CategoryItem> mCategoryItems;
    private int[] mColors;
    private String[] mCategoryTitles;
    private String[] mCategoryID;

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

        setUpCategoryItems();

        mGridView = findViewById(R.id.categories_list);
        mCategoryAdapter = new CategoryAdapter(this, R.layout.grid_view_item, mCategoryItems);
        mGridView.setAdapter(mCategoryAdapter);

        FloatingActionButton fabShare = findViewById(R.id.fab_share);
        fabShare.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_SEND);
                intent.putExtra(Intent.EXTRA_TEXT, Constant.SHARE_CONTENT);
                intent.setType("text/plain");
                startActivity(Intent.createChooser(intent, getString(R.string.share_with)));
            }
        });

    }

    private void setUpCategoryItems() {
        mCategoryItems = new ArrayList<>();
        mCategoryTitles = getResources().getStringArray(R.array.category_title);
        mCategoryID = getResources().getStringArray(R.array.category_ID);

        mColors = getResources().getIntArray(R.array.colors);

        for (int i = 0; i < mCategoryTitles.length; i++) {
            mCategoryItems.add(new CategoryItem(mColors[i], mCategoryTitles[i], mCategoryID[i]));
            Log.d("TAG", "Title\t" + mCategoryTitles[i] + "\tID\t" + mCategoryID[i]);
        }
    }
}

8. Lanjut kita buat Question.java yang berfungsi menyeleksi tampilan soal dan jawaban. QuestionActivity.java yang menampilkan soal, jawaban dan nilainya. Dan QuestionAdapter.java untuk menyeleksi jawaban benar dan salah.

Question.java
package com.azhar.quizsqlite;

public class Question {

    private String mQuestion;
    private String mOption1;
    private String mOption2;
    private String mOption3;
    private String mOption4;
    private String mAnswer;
    private String mCategory;


    Question() {
    }

    Question(String mQuestion, String option1, String option2, String option3, String option4, String answer, String category) {
        this.mQuestion = mQuestion;
        this.mOption1 = option1;
        this.mOption2 = option2;
        this.mOption3 = option3;
        this.mOption4 = option4;
        this.mAnswer = answer;
        this.mCategory = category;
    }

    public String getmQuestion() {
        return mQuestion;
    }

    public String getmOption1() {
        return mOption1;
    }

    public String getmOption2() {
        return mOption2;
    }

    public String getmOption3() {
        return mOption3;
    }

    public String getmOption4() {
        return mOption4;
    }

    public String getmAnswer() {
        return mAnswer;
    }

    public String getmCategory() {
        return mCategory;
    }

    public void setmQuestion(String mQuestion) {
        this.mQuestion = mQuestion;
    }

    public void setmOption1(String mOption1) {
        this.mOption1 = mOption1;
    }

    public void setmOption2(String mOption2) {
        this.mOption2 = mOption2;
    }

    public void setmOption3(String mOption3) {
        this.mOption3 = mOption3;
    }

    public void setmOption4(String mOption4) {
        this.mOption4 = mOption4;
    }

    public void setmAnswer(String mAnswer) {
        this.mAnswer = mAnswer;
    }

    public void setmCategory(String mCategory) {
        this.mCategory = mCategory;
    }
}
QuestionActivity.java
package com.azhar.quizsqlite;

import android.graphics.Color;
import android.os.Bundle;
import android.support.constraint.ConstraintLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Objects;

import static com.azhar.quizsqlite.CategoryAdapter.CATEGORY_COLOR;
import static com.azhar.quizsqlite.CategoryAdapter.CATEGORY_ID;

public class QuestionActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private QuestionAdapter mAdapter;
    private ArrayList<Question> mQuestionList;
    private QuizDBHelper mDbHelper;

    private ConstraintLayout mParentLayout;
    private TextView mScoreTextView;
    private TextView mRemaningQuestionsTextView;
    private int mTotalQuestions;
    private int mScore;

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

        Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

        Bundle categoryBundle = null;
        if (getIntent() != null) {
            categoryBundle = getIntent().getExtras();
        }

        mParentLayout = findViewById(R.id.question_layout);
        if (categoryBundle != null) {
            String hexColor = String.format("#%06X", (0xFFFFFF & categoryBundle.getInt(CATEGORY_COLOR)));
            hexColor = "#44"+hexColor.substring(1);
            mParentLayout.setBackgroundColor(Color.parseColor(hexColor));
        }

        mScoreTextView = findViewById(R.id.score);
        mRemaningQuestionsTextView = findViewById(R.id.remaining_questions);

        mRecyclerView = findViewById(R.id.recyclerView);
        mRecyclerView.setNestedScrollingEnabled(false);
        mRecyclerView.setHasFixedSize(true);

        mDbHelper = new QuizDBHelper(this, categoryBundle);
        if (categoryBundle != null) {
            mQuestionList = mDbHelper.getAllQuestions(categoryBundle.getString(CATEGORY_ID));
            mTotalQuestions = mQuestionList.size();
            mScore = 0;
            displayScore();
        }
        mAdapter = new QuestionAdapter(this, mQuestionList, categoryBundle.getString(CATEGORY_ID));
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerView.setAdapter(mAdapter);
    }

    public void displayScore() {
        String scoreString = "Score " + mScore + "/" + mTotalQuestions;
        mScoreTextView.setText(scoreString);
        mRemaningQuestionsTextView.setText("Remaining: " + mTotalQuestions--);
    }

    public void updateScore() {
        mScore++;
    }
}
QuestionAdapter.java
package com.azhar.quizsqlite;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioButton;
import android.widget.TextView;

import java.util.ArrayList;

public class QuestionAdapter extends RecyclerView.Adapter {

    private Context mContext;
    private ArrayList<Question> mQuestionList;
    private String mCategoryLabel;

    QuestionAdapter(Context context, ArrayList<Question> questionList, String category) {
        this.mContext = context;
        this.mQuestionList = questionList;
        this.mCategoryLabel = category;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        mCategoryLabel = mCategoryLabel.length() > 2 ?
                (mCategoryLabel.substring(0, 1).toUpperCase() + mCategoryLabel.substring(1)) :
                mCategoryLabel.toUpperCase();
        ((QuestionActivity) mContext).setTitle(mCategoryLabel);
        View questionView = LayoutInflater.from(mContext)
                .inflate(R.layout.question_card_layout, parent, false);
        return new QuestionViewHolder(questionView);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        final Question question = mQuestionList.get(position);
        final QuestionViewHolder questionViewHolder = (QuestionViewHolder) holder;
        questionViewHolder.mQuestion.setText(question.getmQuestion());
        questionViewHolder.mRb1.setText(question.getmOption1());
        questionViewHolder.mRb2.setText(question.getmOption2());
        questionViewHolder.mRb3.setText(question.getmOption3());
        questionViewHolder.mRb4.setText(question.getmOption4());

        ArrayList<RadioButton> radioButtons = questionViewHolder.mTableLayout.getChildren();
        for (final RadioButton rb : radioButtons) {
            rb.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    questionViewHolder.mTableLayout.checkAnswer(rb, question.getmAnswer(), mContext);
                }
            });
        }
    }

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

    class QuestionViewHolder extends RecyclerView.ViewHolder {

        TextView mQuestion;
        RadioButton mRb1;
        RadioButton mRb2;
        RadioButton mRb3;
        RadioButton mRb4;

        ToggleButtonGroupTableLayout mTableLayout;

        QuestionViewHolder(View itemView) {
            super(itemView);
            mQuestion = itemView.findViewById(R.id.question);

            mRb1 = itemView.findViewById(R.id.rb1);
            mRb2 = itemView.findViewById(R.id.rb2);
            mRb3 = itemView.findViewById(R.id.rb3);
            mRb4 = itemView.findViewById(R.id.rb4);

            mTableLayout = itemView.findViewById(R.id.table_layout);
        }
    }

}

9. Selanjutnya kita buat QuizContract.java untuk membuat kolom tabel dan QuizDBHelper.java yang bersisi soal dan jawaban jika ingin menambahkan soal-soal bisa diedit di quizdbhelper.

QuizContract.java
package com.azhar.quizsqlite;

import android.provider.BaseColumns;

final class QuizContract {

    private QuizContract() {
    }

    public static class QuestionsTable implements BaseColumns {

        public static final String TABLE_NAME = "quiz_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_OPTION4 = "option4";
        public static final String COLUMN_ANSWER = "answer";
        public static final String COLUMN_CATEGORY = "category";
    }
}
QuizDBHelper.java
package com.azhar.quizsqlite;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;

import com.azhar.quizsqlite.QuizContract.QuestionsTable;

import java.util.ArrayList;
import java.util.List;

public class QuizDBHelper extends SQLiteOpenHelper {

    private static final String DB_NAME = "quizzes.db";
    private static final int DB_VERSION = 8;

    public static final String CATEGORY_MTK = "matematika";
    public static final String CATEGORY_IPA = "ipa";
    public static final String CATEGORY_IPS = "ips";
    public static final String CATEGORY_AGAMA = "agama";
    public static final String CATEGORY_OLAHRAGA = "olahraga";
    public static final String CATEGORY_PROGRAM = "pemrograman";

    private final String CREATE_TABLE_QUERY = "CREATE TABLE " + QuizContract.QuestionsTable.TABLE_NAME +
            "(" +
            QuestionsTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            QuestionsTable.COLUMN_QUESTION + " TEXT, " +
            QuestionsTable.COLUMN_OPTION1 + " TEXT, " +
            QuestionsTable.COLUMN_OPTION2 + " TEXT, " +
            QuestionsTable.COLUMN_OPTION3 + " TEXT, " +
            QuestionsTable.COLUMN_OPTION4 + " TEXT, " +
            QuestionsTable.COLUMN_ANSWER + " TEXT, " +
            QuestionsTable.COLUMN_CATEGORY + " TEXT" +
            ")";

    private final String DROP_TABLE_QUERY = "DROP TABLE IF EXISTS " + QuestionsTable.TABLE_NAME;

    private SQLiteDatabase db;
    private List<Question> mQuestionList;

    private Bundle categoryIntentBundle;

    public QuizDBHelper(Context context, Bundle bundle) {
        super(context, DB_NAME, null, DB_VERSION);
        this.categoryIntentBundle = bundle;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        this.db = db;
        db.execSQL(CREATE_TABLE_QUERY);

        setUpQuestions();
        insertQuestions();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(DROP_TABLE_QUERY);
        onCreate(db);
    }

    private void setUpQuestions() {
        mQuestionList = new ArrayList<>();

        //questions for category agama
        mQuestionList.add(new Question("Berikut ini adalah cara-cara bersyukur kepada Allah SWT, kecuali...", "Membaca hamdalah", "Mengerjakan salat lima waktu", "Berpuasa sepanjang waktu", "Belajar dan mengaji Al-Quran", "Berpuasa sepanjang waktu", CATEGORY_AGAMA));
        mQuestionList.add(new Question("Arti fana yakni...", "Kekal", "Tidak kekal", "Abadi", "Selamanya", "Tidak kekal", CATEGORY_AGAMA));
        mQuestionList.add(new Question("Batas antara alam dunia dengan alam akhirat disebut...", "Alam barzah", "Yaumul hisab", "Yaumul mahsyar", "Yaumul ba’as", "Alam barzah", CATEGORY_AGAMA));
        mQuestionList.add(new Question("Kiamat kecil di kenal dengan istilah...", "Kiamat Kubro", "Kiamat Sugro", "Kiamat Zalzalah", "Hari Akhir", "Kiamat Sugro", CATEGORY_AGAMA));
        mQuestionList.add(new Question("Wukuf di Padang Arafah adalah salah satu...", "Syarat wajib Haji", "Sunnah Haji", "Jenis ibadah Haji", "Rukun Haji", "Rukun Haji", CATEGORY_AGAMA));

        //questions for category ips
        mQuestionList.add(new Question("Sosiologi mempunyai empat ciri ilmu, salah satunya adalah ilmu sosiologi selalu berusaha menyusun abstraksi dari hasil observasi yang konkret di lapangan. Ciri sosiologi tersebut dikenal dengan istilah...", "teoritis", "empiris", "kumulatif", "khayalan", "teoritis", CATEGORY_IPS));
        mQuestionList.add(new Question("Objek sosiologi yang menjelaskan tentang gejala-gejala kehidupan sosial dan proses hubungan antar manusia yang mempengaruhi kesatuan hidup manusia itu sendiri merupakan objek sosiologi...", "material", "formal", "primer", "sekunder", "material", CATEGORY_IPS));
        mQuestionList.add(new Question("Seorang pemimpin upacara bendera menyiapkan peserta upacara setelah diberi instruksi oleh pembina upacara. Dari contoh di atas interaksi terjadi karena memenuhi syarat...", "kontak dan pertemuan", "kontak dan komunikasi", "pengertian dan komunikasi", "kontak dan sugesti", "kontak dan komunikasi", CATEGORY_IPS));
        mQuestionList.add(new Question("Negara Amerika Serikat banyak melakukan investasi seperti peminjaman dana pembangunan untuk Indonesia sebagai negara berkembang. Peminjaman dana pembangunan yang dilakukan Amerika di Indonesia adalah globalisasi dalam bentuk...", "globalisasi perdagangan", "globalisasi pembiayaan", "globalisasi produksi", "globalisasi pembanguna", "globalisasi pembiayaan", CATEGORY_IPS));
        mQuestionList.add(new Question("Sekelompok pemuda yang biasa berkumpul di terminal untuk mabuk-mabukan ditangkap polisi karena sering membuat resah para calon penumpang karena perilaku mereka yang tidak terkendali. Kelompok sosial ini termasuk...", "inconvenient aggregations", "panic crowds", "immoral crowds", "spectator crowds", "immoral crowds", CATEGORY_IPS));

        //questions for category ipa
        mQuestionList.add(new Question("Berikut ini merupakan komponen biotik di alam adalah...", "Tanah liat", "Batu bata", "Air laut", "Jasad renik", "Jasad renik", CATEGORY_IPA));
        mQuestionList.add(new Question("Upaya meminimalisasi sampah hasil limbah rumah tangga agar tidak mencemari perairan dapat dilakukan dengan cara mendaur ulang sampah-sampah di sekitar kita. Seperti dibuat menjadi kompos, kerajinan tangan, dan benda berguna lainnya. Upaya tersebut disebut dengan istilah...", "Recycle", "Reuse", "Reduce", "Repair", "Recycle", CATEGORY_IPA));
        mQuestionList.add(new Question("Batu ginjal merupakan penyakit berbahaya pada sistem ekskresi manusia. Salah satu cara yang dapat dilakukan untuk mencegah penyakit tersebut adalah...", "Banyak mengonsumsi garam mineral", "Banyak mengonsumsi minuman beralkohol", "Banyak mengonsumsi makanan yang mengandung pewarna", "Banyak mengonsumsi air putih", "Banyak mengonsumsi air putih", CATEGORY_IPA));
        mQuestionList.add(new Question("Penyakit menular pada alat kelamin manusia yang disebabkan oleh bakteri Treponema pallidum disebut...", "HIV", "Gonorhoe", "Sifilis", "Keputihan", "Sifilis", CATEGORY_IPA));
        mQuestionList.add(new Question("Berikut ini merupakan kondisi yang dapat terjadi jika organ hati rusak adalah...", "Terganggunya fungsi sistem organ", "Dapat menimbulkan penyakit", "Akumulasi suatu toksik dalam tubuh", "Semua jawaban benar", "Semua jawaban benar", CATEGORY_IPA));

        //questions for category pemrograman
        mQuestionList.add(new Question("Dalam menyusun suatu program,langkah pertama yang harus di lakkukan adalah...", "Membuat program", "Membuat Algoritma", "Proses", "Mempelajari program", "Membuat Algoritma", CATEGORY_PROGRAM));
        mQuestionList.add(new Question("Pemberian nama variabel yang benar adalah...", "%nilai", "nilai_mahasiswa", "NamaMahasiswa", "&panjang", "nilai_mahasiswa", CATEGORY_PROGRAM));
        mQuestionList.add(new Question("Suatu program terpisah dalam blok sendiri yang berfungsi sebagai subprogram (program bagian) disebut...", "Variabel", "Deklarasi", "Prosedur", "Constructor", "Prosedur", CATEGORY_PROGRAM));
        mQuestionList.add(new Question("Istilah \"perulangan\" dalam pemograman pascal dikenal dengan...", "Repeating", "Funtion", "Looping", "Replay", "Looping", CATEGORY_PROGRAM));
        mQuestionList.add(new Question("Tipe data untuk TRUE FALSE adalah...", "String", "Boolean", "Byte", "Char", "Boolean", CATEGORY_PROGRAM));

        //questions for category olahraga
        mQuestionList.add(new Question("Serangan pertama kali untuk memulai permainan dalam permainan bola voli adalah pengertian dari...", "Smash", "Block", "Servis", "Passing", "Servis", CATEGORY_OLAHRAGA));
        mQuestionList.add(new Question("Setiap set dalam permainan bola voli berakhir ketika salah satu tim memperoleh nilai...", "11 poin", "15 poin", "21 poin", "25 poin", "25 poin", CATEGORY_OLAHRAGA));
        mQuestionList.add(new Question("Menyundul bola di sebut juga dengan...", "Shooting", "Heading", "Passing", "Block", "Heading", CATEGORY_OLAHRAGA));
        mQuestionList.add(new Question("Tembakan sambil melompat dalam bola basket di sebut juga dengan istilah...", "Jump Shoot", "Lay Up", "Rebound", "Pivot", "Jump Shoot", CATEGORY_OLAHRAGA));
        mQuestionList.add(new Question("Rencana untuk melakukan suatu penyerangan atau pertahanan sebelum pertandingan di sebut...", "Taktik", "Tehnik", "Formasi", "Strategi", "Strategi", CATEGORY_OLAHRAGA));

        //questions for category matematika
        mQuestionList.add(new Question("Hasil dari -4 + 8 : (-2) x 2 + 5 -2 adalah...", "-9", "-7", "7", "9", "-9", CATEGORY_MTK));
        mQuestionList.add(new Question("Sebuah toko kue selama 8 hari dapat membuat 240 kotak kue. Banyak kue yang dapat dibuat oleh toko tersebut selama 12 hari adalah...", "160 kotak", "260 kotak", "360 kotak", "460 kotak", "360 kotak", CATEGORY_MTK));
        mQuestionList.add(new Question("Pak Arif membeli motor dengan harga Rp15.000.000,00 dan dijual lagi dengan harga Rp16.500.000,00. Berapa perentase keuntungan yang diperoleh?", "1%", "1,5%", "10%", "15%", "10%", CATEGORY_MTK));
        mQuestionList.add(new Question("Berat rata-rata dari 12 siswa adalah 55 kg dan berat rata-rata 15 orang lainya adalah 45 Berat rata-rata dari keseluruhan kedua kelompok tersebut adalah...", "47 kg", "48 kg", "49 kg", "50 kg", "49 kg", CATEGORY_MTK));
        mQuestionList.add(new Question("Sebuah lapangan berbentuk lingkaran dengan diameter 56 m. Di sekeliling lapangan akan dipasang lampu dengan jarak 4 m. Berapa banyak lampu yang diperlukan?", "24 buah", "30 buah", "34 buah", "44 buah", "44 buah", CATEGORY_MTK));
    }

    private void insertQuestions() {
        for(Question q : mQuestionList) {
            ContentValues contentValues = new ContentValues();
            contentValues.put(QuestionsTable.COLUMN_QUESTION, q.getmQuestion());
            contentValues.put(QuestionsTable.COLUMN_OPTION1, q.getmOption1());
            contentValues.put(QuestionsTable.COLUMN_OPTION2, q.getmOption2());
            contentValues.put(QuestionsTable.COLUMN_OPTION3, q.getmOption3());
            contentValues.put(QuestionsTable.COLUMN_OPTION4, q.getmOption4());
            contentValues.put(QuestionsTable.COLUMN_ANSWER, q.getmAnswer());
            contentValues.put(QuestionsTable.COLUMN_CATEGORY, q.getmCategory());
            db.insert(QuestionsTable.TABLE_NAME, null, contentValues);
        }
    }

    public ArrayList<Question> getAllQuestions(String categoryID) {
        Log.d("TAG", "Getting all questions for : " + categoryID);
        ArrayList<Question> questionList = new ArrayList<>();
        db = getReadableDatabase();
        String SELECT_TABLE_QUERY = "SELECT * FROM " + QuestionsTable.TABLE_NAME + " WHERE " + QuestionsTable.COLUMN_CATEGORY + " = \"" + categoryID + "\"";
        Cursor cursor = db.rawQuery(SELECT_TABLE_QUERY, null);
        if(cursor.moveToFirst()) {
            do {
                Question question = new Question();
                question.setmQuestion(cursor.getString(cursor.getColumnIndex(QuestionsTable.COLUMN_QUESTION)));
                question.setmOption1(cursor.getString(cursor.getColumnIndex(QuestionsTable.COLUMN_OPTION1)));
                question.setmOption2(cursor.getString(cursor.getColumnIndex(QuestionsTable.COLUMN_OPTION2)));
                question.setmOption3(cursor.getString(cursor.getColumnIndex(QuestionsTable.COLUMN_OPTION3)));
                question.setmOption4(cursor.getString(cursor.getColumnIndex(QuestionsTable.COLUMN_OPTION4)));
                question.setmAnswer(cursor.getString(cursor.getColumnIndex(QuestionsTable.COLUMN_ANSWER)));
                questionList.add(question);
            } while (cursor.moveToNext());
        }
        cursor.close();
        return questionList;
    }
}

10. Dan yang terakhir kita buat ToggleButtonGroupTableLayout.java untuk menyeleksi warna jawaban yang benar dan salah.

Jika benar akan berwarna hijau dan yang salah akan berwarna merah.
package com.azhar.quizsqlite;

import android.content.Context;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RadioButton;
import android.widget.TableLayout;
import android.widget.TableRow;
import java.util.ArrayList;

public class ToggleButtonGroupTableLayout extends TableLayout {

    private RadioButton mActiveRadioButton;

    public ToggleButtonGroupTableLayout(Context context) {
        super(context);
    }

    public ToggleButtonGroupTableLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ArrayList<RadioButton> getChildren() {
        ArrayList<RadioButton> radioButtons = new ArrayList<>();
        int childCount = this.getChildCount();
        for (int i = 0; i < childCount; i++) {
            TableRow tableRow = (TableRow) this.getChildAt(i);
            int rowChildCount = tableRow.getChildCount();
            for (int j = 0; j < rowChildCount; j++) {
                View v = tableRow.getChildAt(j);
                if (v instanceof RadioButton) {
                    radioButtons.add((RadioButton) v);
                }
            }
        }
        return radioButtons;
    }

    public void checkAnswer(final RadioButton rb, String answer, Context mContext) {
        if (mActiveRadioButton != null) {
            mActiveRadioButton.setChecked(false);
        }
        int id = -1;
        rb.setChecked(true);
        if (rb.getText().equals(answer)) {
            setRadioButtonBackgroundColor(rb, R.color.transparent_green);
            ((QuestionActivity) mContext).updateScore();
        } else {
            setRadioButtonBackgroundColor(rb, R.color.transparent_red);
            for (RadioButton radioButton : getChildren()) {
                if (radioButton.getText().equals(answer)) {
                    setRadioButtonBackgroundColor(radioButton, R.color.transparent_green);
                    id = radioButton.getId();
                }
            }
        }
        ((QuestionActivity) mContext).displayScore();
        mActiveRadioButton = rb;
        for (RadioButton radioButton : getChildren()) {
            radioButton.setClickable(false);
            if (radioButton.getId() != rb.getId() && radioButton.getId() != id) {
                setRadioButtonBackgroundColor(radioButton, R.color.transparent_grey);
                radioButton.setTextColor(getResources().getColor(R.color.transparent_black));
            }
        }

    }

    private void setRadioButtonBackgroundColor(RadioButton button, int colorId) {
        button.getBackground().setColorFilter(Color.parseColor(getContext().getString(colorId)), PorterDuff.Mode.MULTIPLY);
    }
}
Setelah sudah mengikuti langkah-langkah diatas dengan baik, tinggal kalian Run saja. InsyaAllah akan berhasil seperti gambar dibawah ini.

maswijaba.my.id

Jika kalian mendapati error silahkan kalian cek kembali, jika sudah di cek masih error silahkan kalian berkomentar dibawah agar kita bisa diskusikan bersama.

Jika kalian ingin langsung source codenya tanpa tutorial diatas silahkan didownload disini

Sekian tutorial Cara Membuat Aplikasi Quiz Menggunakan Android Studio dengan Database SQLite semoga bermanfaat. Dan jangan lupa membagikan artikel ini kepada teman-teman kalian yang ingin belajar membuat aplikasi Android sederhana, jangan pelit ilmu pokoknya.

Jangan lupa kunjungi maswijaba.my.id untuk artikel bermanfaat lainnya.

Post a Comment for "Cara Membuat Aplikasi Quiz Menggunakan Android Studio dengan Database SQLite"