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)
- Open Android Studio.
- Go to Tools → Device Manager.
- Click Create Device.
- Select a hardware profile (e.g., Pixel).
- Click Next.
- Choose a system image (Android version).
- Click Next → Finish.
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
- Open Android Studio.
- Click Build → Generate Signed Bundle / APK.
- Select APK → Click Next.
- Choose Create new keystore (or select existing).
- Enter the required details:
- Keystore path
- Password
- Key alias
- Key password
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”);
}
});
}
}
