Md Mominul Islam | Software and Data Enginnering | SQL Server, .NET, Power BI, Azure Blog

while(!(succeed=try()));

LinkedIn Portfolio Banner

Latest

Home Top Ad

Responsive Ads Here

Post Top Ad

Responsive Ads Here

Tuesday, August 26, 2025

Master Android App Development: Module 7 - Advanced UI Components

 


Table of Contents

  1. Introduction to Advanced UI Components

  2. RecyclerView for Dynamic Lists

    • 2.1 What is RecyclerView?

    • 2.2 Setting Up RecyclerView

    • 2.3 Real-Life Example: Task List App

    • 2.4 Best Practices and Exception Handling

    • 2.5 Pros, Cons, and Alternatives

  3. ViewPager and TabLayout for Swipeable Screens

    • 3.1 Understanding ViewPager and TabLayout

    • 3.2 Implementing Swipeable Screens

    • 3.3 Real-Life Example: News App Tabs

    • 3.4 Best Practices and Exception Handling

    • 3.5 Pros, Cons, and Alternatives

  4. Custom Views and Canvas Drawing

    • 4.1 Why Custom Views?

    • 4.2 Creating a Custom Progress Bar

    • 4.3 Real-Life Example: Fitness Tracker Gauge

    • 4.4 Best Practices and Exception Handling

    • 4.5 Pros, Cons, and Alternatives

  5. Animations: Property Animations and Transitions

    • 5.1 Introduction to Android Animations

    • 5.2 Implementing Property Animations

    • 5.3 Creating Scene Transitions

    • 5.4 Real-Life Example: Task Completion Animation

    • 5.5 Best Practices and Exception Handling

    • 5.6 Pros, Cons, and Alternatives

  6. Advanced Material Design Components

    • 6.1 Overview of Material Design

    • 6.2 Using Components Like CardView and BottomNavigation

    • 6.3 Real-Life Example: E-Commerce Product Cards

    • 6.4 Best Practices and Exception Handling

    • 6.5 Pros, Cons, and Alternatives

  7. Practical Exercise: Building a Task List App

    • 7.1 Project Setup

    • 7.2 Implementing RecyclerView with Animations

    • 7.3 Adding Swipeable Tabs with ViewPager

    • 7.4 Creating a Custom Progress Indicator

    • 7.5 Enhancing with Material Design

  8. Conclusion and Next Steps


1. Introduction to Advanced UI Components

Welcome to Module 7 of our Master Android App Development series! In this module, we dive into the exciting world of advanced UI components and animations in Android Studio. You'll learn how to create dynamic, interactive, and visually appealing user interfaces that elevate your apps to a professional level. From dynamic lists to swipeable screens, custom-drawn views, and captivating animations, this module equips you with the skills to build modern, user-friendly apps.

By the end of this module, you'll:

  • Master RecyclerView for dynamic, data-driven lists.

  • Implement ViewPager and TabLayout for intuitive swipeable screens.

  • Create Custom Views using Canvas for unique UI elements.

  • Add animations to enhance user experience.

  • Leverage Material Design components for a polished look.

Our approach is practical, code-oriented, and packed with real-life examples, ensuring you can apply these concepts to your own projects. Let’s get started!


2. RecyclerView for Dynamic Lists

2.1 What is RecyclerView?

RecyclerView is a powerful and flexible Android widget for displaying large datasets in a scrollable list or grid. Unlike the older ListView, RecyclerView is optimized for performance, supports custom layouts, and handles dynamic data efficiently through its adapter pattern.

Key Components:

  • ViewHolder: Holds references to the views for each list item.

  • Adapter: Manages data and binds it to the ViewHolder.

  • LayoutManager: Controls the layout (linear, grid, or staggered).

2.2 Setting Up RecyclerView

Let’s walk through setting up a basic RecyclerView.

Step 1: Add Dependencies

Ensure your build.gradle (app-level) includes the RecyclerView library:

implementation 'androidx.recyclerview:recyclerview:1.3.2'

Step 2: Create the Layout

Define the RecyclerView in your layout file (res/layout/activity_main.xml):

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="8dp" />

</androidx.constraintlayout.widget.ConstraintLayout>

Step 3: Create the Item Layout

Create a layout for each list item (res/layout/item_task.xml):

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="8dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="16dp">

        <TextView
            android:id="@+id/taskTitle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/taskDescription"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="14sp" />

    </LinearLayout>
</androidx.cardview.widget.CardView>

Step 4: Create the Data Model

Define a Task class to represent each task:

public class Task {
    private String title;
    private String description;

    public Task(String title, String description) {
        this.title = title;
        this.description = description;
    }

    public String getTitle() {
        return title;
    }

    public String getDescription() {
        return description;
    }
}

Step 5: Create the Adapter

Create a TaskAdapter to bind data to the RecyclerView:

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;

public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskViewHolder> {
    private List<Task> taskList;

    public TaskAdapter(List<Task> taskList) {
        this.taskList = taskList;
    }

    @Override
    public TaskViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_task, parent, false);
        return new TaskViewHolder(view);
    }

    @Override
    public void onBindViewHolder(TaskViewHolder holder, int position) {
        Task task = taskList.get(position);
        holder.taskTitle.setText(task.getTitle());
        holder.taskDescription.setText(task.getDescription());
    }

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

    public static class TaskViewHolder extends RecyclerView.ViewHolder {
        TextView taskTitle, taskDescription;

        public TaskViewHolder(View itemView) {
            super(itemView);
            taskTitle = itemView.findViewById(R.id.taskTitle);
            taskDescription = itemView.findViewById(R.id.taskDescription);
        }
    }
}

Step 6: Set Up RecyclerView in Activity

In your MainActivity, initialize the RecyclerView:

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

        List<Task> taskList = new ArrayList<>();
        taskList.add(new Task("Buy Groceries", "Milk, eggs, bread"));
        taskList.add(new Task("Call Mom", "Check in and plan visit"));
        taskList.add(new Task("Finish Report", "Due by EOD"));

        TaskAdapter adapter = new TaskAdapter(taskList);
        recyclerView.setAdapter(adapter);
    }
}

2.3 Real-Life Example: Task List App

Imagine you’re building a Task List App for a busy professional. The app displays tasks like meetings, errands, and deadlines in a scrollable list. Users can add, edit, or delete tasks, and the list updates dynamically.

Enhancing the Example:

  • Add click listeners to view task details.

  • Implement swipe-to-delete with ItemTouchHelper.

  • Add animations for item addition/removal.

Swipe-to-Delete Implementation:

import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;

ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        int position = viewHolder.getAdapterPosition();
        taskList.remove(position);
        adapter.notifyItemRemoved(position);
    }
};

new ItemTouchHelper(simpleCallback).attachToRecyclerView(recyclerView);

2.4 Best Practices and Exception Handling

Best Practices:

  • Use DiffUtil for efficient list updates.

  • Cache views in ViewHolder to improve performance.

  • Use LinearLayoutManager for simple lists, GridLayoutManager for grids.

Exception Handling:

  • Handle null or empty datasets to avoid crashes.

  • Use try-catch for data parsing errors.

public void setTaskList(List<Task> newList) {
    try {
        if (newList == null) {
            throw new IllegalArgumentException("Task list cannot be null");
        }
        this.taskList = newList;
        notifyDataSetChanged();
    } catch (IllegalArgumentException e) {
        Log.e("TaskAdapter", "Error: " + e.getMessage());
    }
}

2.5 Pros, Cons, and Alternatives

Pros:

  • Efficient handling of large datasets.

  • Flexible layout options.

  • Built-in support for animations.

Cons:

  • Steeper learning curve than ListView.

  • Requires manual setup for complex layouts.

Alternatives:

  • ListView: Simpler but less flexible.

  • Jetpack Compose: Modern UI toolkit for declarative UI.


3. ViewPager and TabLayout for Swipeable Screens

3.1 Understanding ViewPager and TabLayout

ViewPager allows users to swipe between fragments, creating a seamless navigation experience. TabLayout integrates with ViewPager to provide tabbed navigation.

3.2 Implementing Swipeable Screens

Step 1: Add Dependencies

implementation 'androidx.viewpager2:viewpager2:1.0.0'
implementation 'com.google.android.material:material:1.9.0'

Step 2: Create Fragment Layouts

Create layouts for each tab (res/layout/fragment_tab1.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:gravity="center">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Tab 1 Content"
        android:textSize="20sp" />

</LinearLayout>

Step 3: Create Fragments

import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Tab1Fragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_tab1, container, false);
    }
}

Step 4: Set Up ViewPager and TabLayout

In activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toBottomOf="@id/tabLayout"
        app:layout_constraintBottom_toBottomOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Step 5: Create Fragment Adapter

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;

public class ViewPagerAdapter extends FragmentStateAdapter {
    public ViewPagerAdapter(FragmentActivity fragmentActivity) {
        super(fragmentActivity);
    }

    @Override
    public Fragment createFragment(int position) {
        switch (position) {
            case 0: return new Tab1Fragment();
            case 1: return new Tab2Fragment();
            default: return new Tab1Fragment();
        }
    }

    @Override
    public int getItemCount() {
        return 2;
    }
}

Step 6: Connect ViewPager and TabLayout

In MainActivity:

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewPager2 viewPager = findViewById(R.id.viewPager);
        TabLayout tabLayout = findViewById(R.id.tabLayout);

        ViewPagerAdapter adapter = new ViewPagerAdapter(this);
        viewPager.setAdapter(adapter);

        new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
            tab.setText(position == 0 ? "Tab 1" : "Tab 2");
        }).attach();
    }
}

3.3 Real-Life Example: News App Tabs

For a News App, use ViewPager to create tabs for categories like "Top Stories," "Sports," and "Tech." Each tab displays a RecyclerView of articles, combining concepts from Section 2.

3.4 Best Practices and Exception Handling

Best Practices:

  • Use ViewPager2 for modern apps.

  • Keep fragment logic lightweight.

  • Implement tab icons for better UX.

Exception Handling:

  • Handle fragment lifecycle issues.

  • Check for null adapters.

if (adapter == null) {
    Log.e("MainActivity", "Adapter is null");
    return;
}

3.5 Pros, Cons, and Alternatives

Pros:

  • Smooth swipe navigation.

  • Easy integration with TabLayout.

  • Supports dynamic fragments.

Cons:

  • Complex setup for beginners.

  • Memory-intensive with many fragments.

Alternatives:

  • BottomNavigationView: For simpler navigation.

  • Jetpack Compose Navigation: For modern apps.


4. Custom Views and Canvas Drawing

4.1 Why Custom Views?

Custom Views allow you to create unique UI elements not available in standard Android widgets. Using the Canvas API, you can draw shapes, text, and images.

4.2 Creating a Custom Progress Bar

Step 1: Create Custom View

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class CustomProgressBar extends View {
    private Paint paint;
    private float progress = 0f;

    public CustomProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.FILL);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        float width = getWidth();
        float height = getHeight();
        canvas.drawRect(0, 0, width * progress / 100, height, paint);
    }

    public void setProgress(float progress) {
        this.progress = progress;
        invalidate();
    }
}

Step 2: Add to Layout

<com.example.app.CustomProgressBar
    android:id="@+id/customProgressBar"
    android:layout_width="match_parent"
    android:layout_height="50dp" />

Step 3: Update Progress

CustomProgressBar progressBar = findViewById(R.id.customProgressBar);
progressBar.setProgress(75);

4.3 Real-Life Example: Fitness Tracker Gauge

For a Fitness Tracker App, create a circular progress gauge to show daily step progress. Use Canvas to draw arcs and text.

4.4 Best Practices and Exception Handling

Best Practices:

  • Optimize drawing to avoid performance issues.

  • Use attributes for customization.

  • Handle screen size variations.

Exception Handling:

  • Check for null Canvas objects.

  • Validate progress values.

if (canvas == null) {
    Log.e("CustomProgressBar", "Canvas is null");
    return;
}

4.5 Pros, Cons, and Alternatives

Pros:

  • Complete control over UI.

  • Highly customizable.

Cons:

  • Complex to implement.

  • Performance overhead for complex drawings.

Alternatives:

  • Lottie Animations: For pre-designed graphics.

  • Jetpack Compose: For modern custom UI.


5. Animations: Property Animations and Transitions

5.1 Introduction to Android Animations

Animations make apps feel alive. Android supports property animations (e.g., fade, scale) and scene transitions for smooth screen changes.

5.2 Implementing Property Animations

Fade Animation Example:

import android.animation.ObjectAnimator;
import android.view.View;

View view = findViewById(R.id.taskTitle);
ObjectAnimator fadeAnim = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f);
fadeAnim.setDuration(1000);
fadeAnim.start();

5.3 Creating Scene Transitions

Step 1: Define Scenes

Create two layouts for different scenes (res/layout/scene1.xml and res/layout/scene2.xml).

Step 2: Implement Transition

import android.transition.TransitionManager;
import android.view.ViewGroup;

ViewGroup sceneRoot = findViewById(R.id.sceneRoot);
TransitionManager.beginDelayedTransition(sceneRoot);
setContentView(R.layout.scene2);

5.4 Real-Life Example: Task Completion Animation

In the Task List App, animate a task card when marked as complete (e.g., fade out or slide off).

5.5 Best Practices and Exception Handling

Best Practices:

  • Use short animation durations (200-300ms).

  • Chain animations with AnimatorSet.

  • Test on low-end devices.

Exception Handling:

  • Handle null views.

  • Avoid animation conflicts.

if (view == null) {
    Log.e("Animation", "View is null");
    return;
}

5.6 Pros, Cons, and Alternatives

Pros:

  • Enhances user engagement.

  • Easy to implement basic animations.

Cons:

  • Overuse can degrade performance.

  • Complex animations require careful tuning.

Alternatives:

  • Lottie: For pre-built animations.

  • Jetpack Compose Animations: For modern apps.


6. Advanced Material Design Components

6.1 Overview of Material Design

Material Design provides a unified design system for creating polished, consistent UIs. Key components include CardView, BottomNavigationView, and FloatingActionButton.

6.2 Using Components Like CardView and BottomNavigation

CardView Example:

<androidx.cardview.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardElevation="4dp"
    app:cardCornerRadius="8dp">
    <!-- Content -->
</androidx.cardview.widget.CardView>

BottomNavigationView Example:

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottomNavigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:menu="@menu/bottom_nav_menu" />

6.3 Real-Life Example: E-Commerce Product Cards

For an E-Commerce App, use CardView to display product cards with images, prices, and ratings.

6.4 Best Practices and Exception Handling

Best Practices:

  • Follow Material Design guidelines.

  • Use consistent typography and colors.

  • Ensure accessibility (e.g., content descriptions).

Exception Handling:

  • Handle missing menu resources.

  • Validate user inputs in forms.

6.5 Pros, Cons, and Alternatives

Pros:

  • Professional, consistent look.

  • Wide range of components.

Cons:

  • Can increase APK size.

  • Learning curve for customization.

Alternatives:

  • Custom Views: For unique designs.

  • Jetpack Compose: For modern UI.


7. Practical Exercise: Building a Task List App

7.1 Project Setup

Create a new Android Studio project with an Empty Activity. Add dependencies for RecyclerView, ViewPager2, and Material Design.

7.2 Implementing RecyclerView with Animations

Combine the RecyclerView code from Section 2 with a fade-in animation for new tasks.

7.3 Adding Swipeable Tabs with ViewPager

Add two tabs: "To-Do" and "Completed." Use ViewPager2 to switch between task lists.

7.4 Creating a Custom Progress Indicator

Add a custom progress bar to show task completion percentage.

7.5 Enhancing with Material Design

Use CardView for tasks and a FloatingActionButton to add new tasks.


8. Conclusion and Next Steps

Congratulations! You’ve mastered advanced UI components and animations in Android Studio. Practice by building the task list app and experimenting with different layouts and animations. In the next module, we’ll explore networking and APIs to fetch real-time data for your apps.

No comments:

Post a Comment

Thanks for your valuable comment...........
Md. Mominul Islam

Post Bottom Ad

Responsive Ads Here