Android Development Essentials: Components, Data, and Deployment

ListView vs. RecyclerView: A Comparison

ListView (Legacy Component)

ListView is an older Android component used to display a simple vertical list. It has limited performance and customization and manually handles view reuse.

ListView Example: Layout (activity_main.xml)

(Layout definition for ListView goes here)

ListView Example: Implementation (MainActivity.java)

ListView listView = findViewById(R.id.listView);
String[] data = {“Apple”, “Banana”, “Mango”};

ArrayAdapter<String> adapter =
new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, data);

listView.setAdapter(adapter);

RecyclerView (Modern and Efficient)

RecyclerView is a modern, flexible, and efficient component. It enforces the ViewHolder pattern, supports multiple layouts (list, grid), and provides better performance with large datasets.

RecyclerView Example: Layout (activity_main.xml)

(Layout definition for RecyclerView goes here)

RecyclerView Example: Implementation (MainActivity.java)

RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(
new LinearLayoutManager(this));

MyAdapter adapter = new MyAdapter(data);
recyclerView.setAdapter(adapter);

RecyclerView Example: Adapter (MyAdapter.java)

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

String[] data;

MyAdapter(String[] data) {
this.data = data;
}

public static class ViewHolder extends RecyclerView.ViewHolder {
TextView textView;
ViewHolder(View v) {
super(v);
textView = v.findViewById(android.R.id.text1);
}
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(android.R.layout.simple_list_item_1, parent, false);
return new ViewHolder(v);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.textView.setText(data[position]);
}

@Override
public int getItemCount() {
return data.length;
}
}

Android Virtual Devices (AVD) and Spinner Implementation

Steps to Create an Android Virtual Device (AVD)

  1. Open Android Studio.
  2. Go to ToolsDevice Manager.
  3. Click Create Device.
  4. Select a hardware profile (e.g., Pixel).
  5. Click Next.
  6. Choose a system image (Android version).
  7. Click NextFinish.

Implementing the Android Spinner Widget

A Spinner is a dropdown list that allows users to select one option from multiple choices.

Spinner Example: Layout (activity_main.xml)

(Layout definition for Spinner goes here)

Spinner Example: Implementation (MainActivity.java)

Spinner spinner;
String[] items = {“Java”, “Kotlin”, “Python”};

spinner = findViewById(R.id.spinner);

ArrayAdapter<String> adapter = new ArrayAdapter<>(
this,
android.R.layout.simple_spinner_item,
items
);

adapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);

spinner.setAdapter(adapter);

Mobile Application Development Approaches

The following are different approaches to mobile application development:

  • Native App Development
    Apps developed for a single platform (Android/iOS) using platform-specific languages.
    Characteristics: High performance, high cost.

  • Web App Development
    Apps run in a mobile browser using HTML, CSS, and JavaScript.
    Characteristics: Low cost, limited device access.

  • Hybrid App Development
    Web apps wrapped inside a native container.
    Characteristics: Single codebase, moderate performance.

  • Cross-Platform Development
    One codebase used for multiple platforms (e.g., Flutter, React Native).
    Characteristics: Good performance, cost-effective.

  • Progressive Web Apps (PWA)
    Web apps with native-like features (offline capabilities, notifications).
    Characteristics: Lightweight, no app store required.

Android SQLite Database Operations (Insert and Display)

Develop an Android application using an SQLite database named college with a table named student (columns: Roll (Integer, Primary Key), Name (Text), and Address (Text)). The application must insert five student records and display the information.

1. Database Helper Class (DatabaseHelper.java)

package com.example.collegedb;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {

private static final String DB_NAME = “college”;
private static final int DB_VERSION = 1;
private static final String TABLE_NAME = “student”;
private static final String COL_ROLL = “Roll”;
private static final String COL_NAME = “Name”;
private static final String COL_ADDRESS = “Address”;

public DatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
String createTable = “CREATE TABLE ” + TABLE_NAME + ” (” +
COL_ROLL + ” INTEGER PRIMARY KEY, ” +
COL_NAME + ” TEXT, ” +
COL_ADDRESS + ” TEXT)”;
db.execSQL(createTable);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(“DROP TABLE IF EXISTS ” + TABLE_NAME);
onCreate(db);
}

// Insert student
public void insertStudent(int roll, String name, String address) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COL_ROLL, roll);
cv.put(COL_NAME, name);
cv.put(COL_ADDRESS, address);
db.insert(TABLE_NAME, null, cv);
}

// Get all students
public Cursor getAllStudents() {
SQLiteDatabase db = this.getReadableDatabase();
return db.rawQuery(“SELECT * FROM ” + TABLE_NAME, null);
}
}

2. Layout (activity_main.xml)

(Layout definition containing buttons and a TextView for results goes here)

3. MainActivity (MainActivity.java)

package com.example.collegedb;

import androidx.appcompat.app.AppCompatActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

DatabaseHelper db;
Button btnInsert, btnShow;
TextView txtResult;

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

db = new DatabaseHelper(this);

btnInsert = findViewById(R.id.btnInsert);
btnShow = findViewById(R.id.btnShow);
txtResult = findViewById(R.id.txtResult);

btnInsert.setOnClickListener(v -> {
db.insertStudent(1, “Ram”, “Kathmandu”);
db.insertStudent(2, “Shyam”, “Pokhara”);
db.insertStudent(3, “Sita”, “Lalitpur”);
db.insertStudent(4, “Gita”, “Bhaktapur”);
db.insertStudent(5, “Hari”, “Janakpur”);
txtResult.setText(“5 Students Inserted Successfully!”);
});

btnShow.setOnClickListener(v -> {
Cursor cursor = db.getAllStudents();
StringBuilder sb = new StringBuilder();
while (cursor.moveToNext()) {
sb.append(“Roll: “).append(cursor.getInt(0))
.append(“, Name: “).append(cursor.getString(1))
.append(“, Address: “).append(cursor.getString(2))
.append(“\n”);
}
txtResult.setText(sb.toString());
cursor.close();
});
}
}

Displaying an Android Alert Dialog Box

XML Layout (activity_main.xml)

(Layout definition containing a button to trigger the dialog goes here)

Java Code (MainActivity.java)

package com.example.alertdialog;

import android.os.Bundle;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

Button btnAlert;

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

btnAlert = findViewById(R.id.btnAlert);

btnAlert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

AlertDialog.Builder builder =
new AlertDialog.Builder(MainActivity.this);

builder.setTitle(“Alert”);
builder.setMessage(“This is an Alert Dialog”);
builder.setCancelable(false);

builder.setPositiveButton(“OK”, (dialog, which) ->
Toast.makeText(MainActivity.this,
“OK Clicked”, Toast.LENGTH_SHORT).show());

builder.setNegativeButton(“Cancel”, (dialog, which) ->
dialog.dismiss());

builder.show();
}
});
}
}

Retrieving Content from a Remote Server (HTTP)

1. Add Internet Permission – in AndroidManifest.xml

(Add the <uses-permission android:name=”android.permission.INTERNET”/> tag)

2. Layout (activity_main.xml)

(Layout definition containing a button and a TextView for results goes here)

3. MainActivity (MainActivity.java)

package com.example.remotedata;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

Button btnFetch;
TextView txtResult;

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

btnFetch = findViewById(R.id.btnFetch);
txtResult = findViewById(R.id.txtResult);

btnFetch.setOnClickListener(v -> new Thread(() -> {
try {
URL url = new URL(“https://jsonplaceholder.typicode.com/posts/1“);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod(“GET”);

BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuilder data = new StringBuilder();
String line;
while ((line = br.readLine()) != null) data.append(line);

runOnUiThread(() -> txtResult.setText(data.toString()));

} catch (Exception e) {
e.printStackTrace();
}
}).start());
}
}

Signed APK Generation and User Location Retrieval

Generating a Signed APK in Android Studio

  1. Open Android Studio.
  2. Click BuildGenerate Signed Bundle / APK.
  3. Select APK → Click Next.
  4. Choose Create new keystore (or select existing).
  5. Enter the required details:
  • Keystore path
  • Password
  • Key alias
  • Key password
Select Build Variant → release. Click Finish.

Locating the User’s Current Location

Add Permissions (AndroidManifest.xml)

(Add location permissions, e.g., <uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION”/>)

Layout (activity_main.xml)

(Layout definition containing a button and a TextView for location display goes here)

Java Code (MainActivity.java)

package com.example.locationapp;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

TextView txtLocation;
Button btnLocation;

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

txtLocation = findViewById(R.id.txtLocation);
btnLocation = findViewById(R.id.btnLocation);

ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

btnLocation.setOnClickListener(v -> {
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

if (location != null) {
txtLocation.setText(
“Latitude: ” + location.getLatitude() +
“\nLongitude: ” + location.getLongitude()
);
} else {
txtLocation.setText(“Location not available”);
}
});
}
}