✅ 1.
Create New Android Project
Open Android Studio and create a new project.
Choose "Empty Activity".
Name it, e.g., JsonRecyclerViewApp.
✅ 2. Modify activity_main.xml
<!-- res/layout/activity_main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="[Link]
xmlns:tools="[Link]
android:id="@+id/mainLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- Progress bar for loading indicator -->
<ProgressBar
android:id="@+id/progressBar"
android:layout_centerInParent="true"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<[Link]
android:id="@+id/recyclerView"
android:layout_below="@id/progressBar"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
✅ 3. Create item_layout.xml
<!-- res/layout/item_layout.xml -->
<?xml version="1.0" encoding="utf-8"?>
<[Link]
xmlns:android="[Link]
android:layout_margin="8dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:padding="16dp"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/titleText"
android:textStyle="bold"
android:textSize="18sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/descriptionText"
android:textSize="14sp"
android:layout_marginTop="4dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</[Link]>
✅ 4. Create a Data Model Class
// [Link]
public class DataItem {
private String title;
private String description;
public String getTitle() {
return title;
public String getDescription() {
return description;
✅ 5. Setup Retrofit for JSON Fetching
Add dependencies to [Link] (app):
implementation '[Link].retrofit2:retrofit:2.9.0'
implementation '[Link].retrofit2:converter-gson:2.9.0'
implementation '[Link]:recyclerview:1.3.1'
implementation '[Link]:cardview:1.0.0'
Create the Retrofit Interface:
// [Link]
import [Link];
import [Link];
import [Link];
public interface ApiService {
@GET("your_endpoint_here") // Replace with your endpoint path
Call<List<DataItem>> getDataItems();
✅ 6. Create Retrofit Client
// [Link]
import [Link];
import [Link];
public class RetrofitClient {
private static final String BASE_URL = "[Link] // Replace with actual
base URL
private static Retrofit retrofit;
public static Retrofit getRetrofitInstance() {
if (retrofit == null) {
retrofit = new [Link]()
.baseUrl(BASE_URL)
.addConverterFactory([Link]())
.build();
return retrofit;
}
✅ 7. Create RecyclerView Adapter
// [Link]
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class DataAdapter extends [Link]<[Link]> {
private List<DataItem> dataList;
public DataAdapter(List<DataItem> dataList) {
[Link] = dataList;
@NonNull
@Override
public DataViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = [Link]([Link]())
.inflate([Link].item_layout, parent, false);
return new DataViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull DataViewHolder holder, int position) {
DataItem item = [Link](position);
[Link]([Link]());
[Link]([Link]());
@Override
public int getItemCount() {
return [Link]();
public static class DataViewHolder extends [Link] {
TextView titleText, descriptionText;
public DataViewHolder(@NonNull View itemView) {
super(itemView);
titleText = [Link]([Link]);
descriptionText = [Link]([Link]);
✅ 8. MainActivity Code
// [Link]
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
ProgressBar progressBar;
DataAdapter dataAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
[Link](savedInstanceState);
setContentView([Link].activity_main);
recyclerView = findViewById([Link]);
progressBar = findViewById([Link]);
[Link](new LinearLayoutManager(this));
fetchData();
}
private void fetchData() {
[Link]([Link]);
ApiService apiService = [Link]().create([Link]);
Call<List<DataItem>> call = [Link]();
[Link](new Callback<List<DataItem>>() {
@Override
public void onResponse(Call<List<DataItem>> call, Response<List<DataItem>>
response) {
[Link]([Link]);
if ([Link]() && [Link]() != null) {
List<DataItem> dataItems = [Link]();
dataAdapter = new DataAdapter(dataItems);
[Link](dataAdapter);
} else {
[Link]([Link], "Data load failed",
Toast.LENGTH_SHORT).show();
@Override
public void onFailure(Call<List<DataItem>> call, Throwable t) {
[Link]([Link]);
[Link]([Link], "Network error: " + [Link](),
Toast.LENGTH_LONG).show();
});
}
✅ 9. Run the Application
Replace "[Link] with a real JSON endpoint.
Test the app on a device or emulator.
Make sure internet permission is added in [Link]:
<uses-permission android:name="[Link]" />
✅ Optional Enhancements
Search functionality: Use SearchView and filter the adapter list.
Pagination: Load data page by page using scroll listener.
Sorting: Use [Link]() or Comparator on the list before setting the adapter.
Loading animation: Add animations or shimmer effect using third-party libraries.