Cara upload image dan text update firebase database

*Tulisan akan muncul*
*di sini*

SELAMAT DATANG SELAMAT MEMBACA
Penelusuran : Cara upload image dan text update firebase database,  tips image text firebase

tips upluad image
SOURCE IMAGE : Rizal DRCTI

Bertemu kembali bersama Blog Rizal DRC blog berbagi info menarik, wawasan dan tips untuk teman, sahabat dan pengunjung setia semoga dapat menambah pengetahuan kita bersama.

Tips kali ini kita mencoba share berbagi untuk teman teman yang kebetulan sedang belajar membuat aplikasi mobile melalui android studio dan sinkron database nya melalui Firebase Database, atau ingin referensi membuat CRUD database firebase ke android studio mengunakan bahasa java. Dimana proses updaate atau create mengisi gambar dan text untuk aplikasi CRUD sederhana melalui firebase database. semoga bermanfaat

mengenal sedikit tentang Firebase dapat di lihat disini.

oke kita langsung saja rencana kita untuk cara upluad image dan text untuk update data di proyek aplikasi CRUD melalui android studio. disini saya contohkan saya untuk sebuah proyek sederhana berupa aplikasi inventaris kantor dimana tujuan kita disini mengisi gambar dan keterangan lain tentang gambar,

Langkah-langkah untuk membuat aplikasi CRUD (Create, Read, Update, Delete) data barang inventaris kantor di Android Studio menggunakan Firebase Realtime Database dan bahasa Java.

Buka Perangkat Android Studio dan Buat nama Proyek Barang inventaris atau nama lain yang temans ingin kan. bagi teman khususnya, untuk pengenalan membuat proyek baru di android studio dan koneksikan dengan tempat penyimpanan database nya melalui Firebase Console mengenal menu menu yang ada pada android studio dan fungsi firebase bagi pemula dapat kunjungi disini ya, dikarenakan hal ini bagi tingkat lanjut untuk CRUD update gambar dan text pada formulir kita, kita fokuskan saja tips nya disini.

Persiapan dan Atep by Step pada Android Studio .

1. Menyesuaikan implementasi untuk proyek aplikasi

Sebelum membuat proyek aplikasi perlu dipersiapkan nama proyek, dependencies yang cocok pada gradle proyek dimana implementasi untuk proyek semoga dapat berjalan sesuai build.gradle proyek yang akan kita buat.

lengkapi implementasi pada proyek aplikasi kita seperti dibawah ini

dependencies {

implementation libs.appcompat
implementation libs.material
implementation libs.activity
implementation libs.constraintlayout
implementation libs.firebase.storage
implementation libs.firebase.database
implementation libs.firebase.auth
implementation libs.swiperefreshlayout
testImplementation libs.junit
androidTestImplementation libs.ext.junit
androidTestImplementation libs.espresso.core
implementation platform(libs.firebase.bom)
implementation(libs.picasso)
implementation libs.circleimageview
implementation fileTree(dir: 'libs', include: ['*.jar'])

}


2. Membuat Data Model Untuk Class Kita beri nama Inventaris

Untuk suatu proyek yang akan kita CRUD nantinya di perlukan model kelas atau data yang akan kota masukkan nantinya saat kita isi data, edit data. kita berikan saja contoh untu data data yang di perlukan misalnya untuk inventaris barang, untuk pembelaran kita buat nama kelas dengan nama Inventaris

Kode untuk data model kelas

package com.rizaldrc.belajar.Model;

public class Inventaris {
private String id; // Digunakan untuk kunci Firebase
private String namaBarang;
private String jadwalMasuk;
private String deskripsi;
private String imageUrl; // URL gambar dari Firebase Storage

public Inventaris() {
// Konstruktor kosong diperlukan untuk Firebase Realtime Database
}

public Inventaris(String id, String namaBarang, String jadwalMasuk, String deskripsi, String imageUrl) {
this.id = id;
this.namaBarang = namaBarang;
this.jadwalMasuk = jadwalMasuk;
this.deskripsi = deskripsi;
this.imageUrl = imageUrl;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getNamaBarang() {
return namaBarang;
}

public void setNamaBarang(String namaBarang) {
this.namaBarang = namaBarang;
}

public String getJadwalMasuk() {
return jadwalMasuk;
}

public void setJadwalMasuk(String jadwalMasuk) {
this.jadwalMasuk = jadwalMasuk;
}

public String getDeskripsi() {
return deskripsi;
}

public void setDeskripsi(String deskripsi) {
this.deskripsi = deskripsi;
}

public String getImageUrl() {
return imageUrl;
}

public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}

}


3. Buat Halaman Activity Baru Untuk update data inventaris, "contoh" AddEditInvent

Nah ini inti dari kita untuk membuat halaman dimana kita membuat data bisa gambarnya kita upload dan memiliki text sesuai pada judul halaman blog yang kita share. oke kita buat nama activity atau halamanya judul nama activity AddEditInvent

Buat Kode untuk AddEditInvent.java

package com.rizaldrc.belajar;

import android.annotation.SuppressLint;
import android.app.DatePickerDialog;
import android.content.Intent;
import android.icu.util.Calendar;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import com.rimbocepo88.sakatotrip.Model.Inventaris;
import com.squareup.picasso.Picasso;

import java.text.SimpleDateFormat;
import java.util.Locale;

public class AddEditInvent extends AppCompatActivity {
private ImageView imageViewItem,imgchoose;
private Button buttonSave;
private EditText postnama, JadwalMasuk, desc;

private Uri imageUri;
private String currentImageUrl; // Untuk menyimpan URL gambar yang ada (saat edit)
private String barangId; // Null jika tambah baru, ada jika edit

private DatabaseReference databaseReference;
private StorageReference storageReference;

private ActivityResultLauncher<String> mGetContent;



@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_add_edit_invent);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
postnama = (EditText) findViewById(R.id.addnamabarang);
desc = (EditText) findViewById(R.id.adddeskripsi);
buttonSave = (Button) findViewById(R.id.sign_up);
imgchoose = (ImageView)findViewById(R.id.addImg);
JadwalMasuk = findViewById(R.id.addwaktu);
imageViewItem = (ImageView) findViewById(R.id.set_image);


databaseReference = FirebaseDatabase.getInstance().getReference("barangInventaris");
storageReference = FirebaseStorage.getInstance().getReference("inventaris_images");

// Initialize ActivityResultLauncher for image selection
mGetContent = registerForActivityResult(new ActivityResultContracts.GetContent(),
uri -> {
if (uri != null) {
imageUri = uri;
Picasso.get().load(imageUri).into(imageViewItem);
}
});

imgchoose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openImageChooser();
}
});

JadwalMasuk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog(JadwalMasuk);
}
});

buttonSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveBarang();
}
});

// Cek jika sedang dalam mode edit untuk RecyclerView dta (ada data barang yang GaleriInvent)
Intent intent = getIntent();
if (intent != null && intent.hasExtra("barang_id")) {
barangId = intent.getStringExtra("barang_id");
postnama.setText(intent.getStringExtra("barang_nama"));
JadwalMasuk.setText(intent.getStringExtra("barang_jadwal_masuk"));
desc.setText(intent.getStringExtra("barang_desc"));
currentImageUrl = intent.getStringExtra("barang_image_url");

if (currentImageUrl != null && !currentImageUrl.isEmpty()) {
Picasso.get().load(currentImageUrl).into(imageViewItem);
}
buttonSave.setText("Update Barang");
}
}

private void openImageChooser() {
mGetContent.launch("image/*");
}

private void showDatePickerDialog(final EditText editText) {
Calendar calendar = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
calendar = Calendar.getInstance();
}
int year = 0;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
year = calendar.get(Calendar.YEAR);
}
int month = 0;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
month = calendar.get(Calendar.MONTH);
}
int day = 0;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
day = calendar.get(Calendar.DAY_OF_MONTH);
}

DatePickerDialog datePickerDialog = new DatePickerDialog(this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Calendar selectedDate = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
selectedDate = Calendar.getInstance();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
selectedDate.set(year, monthOfYear, dayOfMonth);
}
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
editText.setText(sdf.format(selectedDate.getTime()));
}
}
}, year, month, day);
datePickerDialog.show();
}

private void saveBarang() {
String nama = postnama.getText().toString().trim();
String jadwalMasuk = JadwalMasuk.getText().toString().trim();
String deskripsi = desc.getText().toString().trim();

if (nama.isEmpty() || jadwalMasuk.isEmpty() || deskripsi.isEmpty()) {
Toast.makeText(this, "Harap lengkapi semua bidang", Toast.LENGTH_SHORT).show();
return;
}

if (imageUri != null) {
uploadImageAndSaveData(nama, jadwalMasuk, deskripsi);
} else if (currentImageUrl != null && !currentImageUrl.isEmpty()) {
// Jika tidak ada gambar baru yang dipilih, dan ada gambar lama, gunakan gambar lama
saveData(nama, jadwalMasuk, deskripsi, currentImageUrl);
} else {
// Jika tidak ada gambar dan tidak ada gambar lama
saveData(nama, jadwalMasuk, deskripsi, ""); // Atau null, tergantung kebutuhan
}
}

private void uploadImageAndSaveData(final String nama, final String jadwalMasuk, final String deskripsi) {
if (imageUri != null) {
StorageReference fileReference = storageReference.child(System.currentTimeMillis() + "." + getFileExtension(imageUri));

fileReference.putFile(imageUri)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
fileReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
String imageUrl = uri.toString();
saveData(nama, jadwalMasuk, deskripsi, imageUrl);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(AddEditInvent.this, "Gagal mendapatkan URL gambar: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(AddEditInvent.this, "Gagal mengunggah gambar: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}

private void saveData(String nama, String jadwalMasuk, String deskripsi, String imageUrl) {
if (barangId == null) {
// Add new item
String id = databaseReference.push().getKey();
Inventaris inventaris = new Inventaris(id, nama, jadwalMasuk, deskripsi, imageUrl);
databaseReference.child(id).setValue(inventaris)
.addOnSuccessListener(aVoid -> {
Toast.makeText(AddEditInvent.this, "Barang berhasil ditambahkan", Toast.LENGTH_SHORT).show();
finish();
})
.addOnFailureListener(e -> Toast.makeText(AddEditInvent.this, "Gagal menambahkan barang: " + e.getMessage(), Toast.LENGTH_SHORT).show());
} else {
// Update existing item
Inventaris editBarang = new Inventaris(barangId, nama, jadwalMasuk, deskripsi, imageUrl);
databaseReference.child(barangId).setValue(editBarang)
.addOnSuccessListener(aVoid -> {
Toast.makeText(AddEditInvent.this, "Barang berhasil diperbarui", Toast.LENGTH_SHORT).show();
finish();
})
.addOnFailureListener(e -> Toast.makeText(AddEditInvent.this, "Gagal memperbarui barang: " + e.getMessage(), Toast.LENGTH_SHORT).show());
}
}

private String getFileExtension(Uri uri) {
return getContentResolver().getType(uri).substring(getContentResolver().getType(uri).lastIndexOf('/') + 1);
}
}


4. Membuat Layout XML AddEditInvent.xml

Untuk membuat halaman layout xml bagi activity java AddEditInvent perlu di perhatikan adalah kode id mewakili image dan text serta button harus sesui dengan java AddEditInvent

Buat Kode untuk AddEditInvent.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:scrollbars="none"
tools:context=".AddEditInvent">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<ScrollView
android:id="@+id/scrjo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="vertical"
android:padding="15dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.495"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.436">

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

<ImageView
android:id="@+id/set_image"
android:layout_width="140dp"
android:layout_height="140dp"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="4dp"
android:layout_marginTop="4dp"
android:padding="4dp"
android:src="@drawable/shadow_bottom"
app:civ_border_color="#FF000000"
app:civ_border_width="2dp" />

<ImageView
android:id="@+id/addImg"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="165dp"
android:layout_marginTop="-40dp"
android:layout_marginBottom="8dp"
app:srcCompat="@drawable/baseline_add_photo_alternate_24" />

<EditText
android:id="@+id/addnamabarang"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:ems="12"
android:fontFamily="monospace"
android:hint="Nama Barang"
android:inputType="textMultiLine"
android:padding="20sp"
android:textColor="@color/black"
android:textColorHint="@color/black"
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.076" />

<EditText
android:id="@+id/adddeskripsi"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:ems="12"
android:fontFamily="monospace"
android:hint="Deskripsi"
android:inputType="textMultiLine"
android:padding="20sp"
android:textColor="@color/black"
android:textColorHint="@color/black"
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.076" />


<EditText
android:id="@+id/addwaktu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:ems="12"
android:fontFamily="monospace"
android:hint="Waktu"
android:inputType="number"
android:padding="20sp"
android:textAlignment="center"
android:textColor="@color/black"
android:textColorHint="@color/black"
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.076" />

<androidx.appcompat.widget.AppCompatButton
android:id="@+id/sign_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:ems="8"
android:fontFamily="monospace"
android:padding="10sp"
android:text="SIMPAN"
android:textAlignment="center"
android:textColor="#3F51B5"
android:textSize="17sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="MissingConstraints" />
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>


5. Membuat Activity Utama untuk Tampilan Data

Membuat Tampilan Data yang Sudah kita Upload nantinya adalah daftar galeri inventaris, mari kita buat activity atau halaman baru dengan membuat nama "GaleriInvent".

Kode untuk GaleriInvent.java

package com.rizaldrc.belajar;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.rimbocepo88.sakatotrip.Model.Inventaris;

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

public class GaleriInvent extends AppCompatActivity {
private RecyclerView recyclerView;
private InventAdapter adapter;
private List<Inventaris> inventarisList;
private DatabaseReference databaseReference;
private FloatingActionButton fabAdd;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_galeri_invent);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
recyclerView = findViewById(R.id.inventrecyclerView);
fabAdd = findViewById(R.id.fabinvent);

recyclerView.setLayoutManager(new LinearLayoutManager(this));
inventarisList = new ArrayList<>();
adapter = new InventAdapter(this, inventarisList);
recyclerView.setAdapter(adapter);

// Inisialisasi Firebase Database
databaseReference = FirebaseDatabase.getInstance().getReference("barangInventaris");

fabAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(GaleriInvent.this, AddEditInvent.class);
startActivity(intent);
}
});

loadBarangData();
}

private void loadBarangData() {
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
inventarisList.clear();
for (DataSnapshot postSnapshot : snapshot.getChildren()) {
Inventaris inventaris = postSnapshot.getValue(Inventaris.class);
if (inventaris != null) {
inventaris.setId(postSnapshot.getKey()); // Set ID dari kunci Firebase
inventarisList.add(inventaris);
}
}
adapter.notifyDataSetChanged();
}

@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(GaleriInvent.this, "Gagal memuat data: " + error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}

// Tambahkan metode untuk menghapus barang (misalnya, dengan dialog konfirmasi)
public void deleteBarang(String barangId) {
// Hapus dari Realtime Database
databaseReference.child(barangId).removeValue()
.addOnSuccessListener(aVoid -> {
Toast.makeText(GaleriInvent.this, "Barang berhasil dihapus", Toast.LENGTH_SHORT).show();
// Opsional: Hapus gambar dari Firebase Storage jika ada
deleteImageFromStorage(barangId); // Panggil metode untuk menghapus gambar
})
.addOnFailureListener(e -> Toast.makeText(GaleriInvent.this, "Gagal menghapus barang: " + e.getMessage(), Toast.LENGTH_SHORT).show());
}
private void deleteImageFromStorage(String barangId) {
// Dapatkan referensi ke gambar berdasarkan ID barang
// Ini mengasumsikan Anda menyimpan URL gambar di objek Barang
// dan Anda bisa mendapatkan URL tersebut dari Firebase sebelum menghapus
// Untuk implementasi yang lebih robust, Anda mungkin perlu menyimpan nama file gambar di database
// atau mengambil URL gambar dari objek Barang sebelum menghapusnya dari database.

// Contoh sederhana (membutuhkan penyesuaian jika struktur penyimpanan gambar Anda berbeda):
// Anda perlu mengambil URL gambar dari database terlebih dahulu sebelum menghapus node barang.
// Atau, jika Anda menyimpan nama file unik (misalnya ID barang) di Storage, Anda bisa langsung menghapus.

databaseReference.child(barangId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Inventaris barang = snapshot.getValue(Inventaris.class);
if (barang != null && barang.getImageUrl() != null && !barang.getImageUrl().isEmpty()) {
StorageReference imageRef = FirebaseStorage.getInstance().getReferenceFromUrl(barang.getImageUrl());
imageRef.delete().addOnSuccessListener(aVoid -> {
// Gambar berhasil dihapus dari Storage
Log.d("DeleteImage", "Gambar berhasil dihapus dari Storage.");
}).addOnFailureListener(e -> {
// Gagal menghapus gambar dari Storage
Log.e("DeleteImage", "Gagal menghapus gambar dari Storage: " + e.getMessage());
});
}
}

@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.e("DeleteImage", "Gagal mengambil data barang untuk menghapus gambar: " + error.getMessage());
}
});
}
}


6. Membuat kode untuk layout XML, galeri_invent.xml

Kembali langkah yang sama Untuk membuat halaman layout xml bagi activity java GaleriInvent perlu di perhatikan adalah kode id mewakili RecyclerView dan FloadButton harus sesuai dengan GaleriInvent.java. abaikan untuk Include dan SearchView untuk ini tidak kita buatkan, temans bisa nantinya dengan terus berkunjung kedepn kita buatkan karena kita sesuai judul share saat ini

Kode galeri_invent,xml

<androidx.drawerlayout.widget.DrawerLayout 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/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/postToolbar"
app:layout_constraintVertical_bias="1.0"
tools:context=".GaleriInvent">

<RelativeLayout
android:id="@+id/parentpost"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">

<include
android:id="@+id/postToolbarpost"
layout="@layout/home_toolbar"
tools:layout_editor_absoluteX="16dp"
tools:layout_editor_absoluteY="0dp" />

<androidx.appcompat.widget.SearchView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:id="@+id/searchpost"
app:iconifiedByDefault="false"
app:searchHintIcon="@null"
app:queryHint="Search Invent..."
android:focusable="false"
android:layout_below="@+id/postToolbarpost"
app:closeIcon="@drawable/baseline_backspace_24"
app:searchIcon="@android:drawable/ic_menu_search"
android:background="@drawable/sircular"/>
<androidx.recyclerview.widget.RecyclerView
android:layout_marginTop="10dp"
android:layout_below="@id/searchpost"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/inventrecyclerView"
android:scrollbars="vertical"/>

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabinvent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginStart="40dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="40dp"
android:layout_marginBottom="40dp"
android:backgroundTint="@color/grad2_c7"
android:src="@android:drawable/ic_menu_edit"
app:tint="@color/white" />
</RelativeLayout>

</androidx.drawerlayout.widget.DrawerLayout>


7. Membuat Adapter Untuk Data Tampilan di GaleriInvent

Pada GaleriInvent tampilan RecyclerView diperlikan adapter class , mari kita buat nama adapter "InventAdapter"

Membuat Adapter dengan nama InventAdapter

package com.rimbocepo88.sakatotrip;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.MenuItem; // Import ini
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.PopupMenu; // Import ini
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.rimbocepo88.sakatotrip.Model.Inventaris;
import com.squareup.picasso.Picasso;


import java.util.List;

public class InventAdapter extends RecyclerView.Adapter<InventAdapter.BarangViewHolder> {

private Context context;
private List<Inventaris> barangList;

public InventAdapter(Context context, List<Inventaris> barangList) {
this.context = context;
this.barangList = barangList;
}

@NonNull
@Override
public BarangViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_list_inventaris, parent, false);
return new BarangViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull BarangViewHolder holder, int position) {
Inventaris barang = barangList.get(position);
holder.textViewNamaBarang.setText(barang.getNamaBarang());
holder.textViewJadwalMasuk.setText("Masuk: " + barang.getJadwalMasuk());
holder.textViewJadwalKeluar.setText("Deskripsi: " + barang.getDeskripsi());

if (barang.getImageUrl() != null && !barang.getImageUrl().isEmpty()) {
Picasso.get().load(barang.getImageUrl())
.placeholder(R.drawable.progress_bar) // Ganti dengan placeholder Anda
.fit()
.centerCrop()
.into(holder.imageViewItem);
} else {
holder.imageViewItem.setImageResource(R.drawable.progress_bar); // Set placeholder jika tidak ada gambar
}

// Tambahkan OnLongClickListener ke itemView
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
showPopupMenu(v, barang); // Panggil metode showPopupMenu
return true; // Return true untuk mengindikasikan event telah dikonsumsi
}
});
}

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

public static class BarangViewHolder extends RecyclerView.ViewHolder {
ImageView imageViewItem;
TextView textViewNamaBarang;
TextView textViewJadwalMasuk;
TextView textViewJadwalKeluar;

public BarangViewHolder(@NonNull View itemView) {
super(itemView);
imageViewItem = itemView.findViewById(R.id.imageViewItem);
textViewNamaBarang = itemView.findViewById(R.id.textViewNamaBarang);
textViewJadwalMasuk = itemView.findViewById(R.id.textViewJadwalMasuk);
textViewJadwalKeluar = itemView.findViewById(R.id.textViewdesck);
}
}

// Metode untuk menampilkan PopupMenu
private void showPopupMenu(View view, Inventaris barang) {
PopupMenu popup = new PopupMenu(context, view);
popup.getMenuInflater().inflate(R.menu.item_option_menu, popup.getMenu()); // Inflate menu XML

popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
int id = item.getItemId(); // Dapatkan ID item menu yang diklik

if (id == R.id.action_edit) { // Jika item "Edit" diklik
Intent intent = new Intent(context, AddEditInvent.class);
// Kirim data barang yang akan diedit ke AddEditItemActivity
intent.putExtra("barang_id", barang.getId());
intent.putExtra("barang_nama", barang.getNamaBarang());
intent.putExtra("barang_jadwal_masuk", barang.getJadwalMasuk());
intent.putExtra("barang_desc", barang.getDeskripsi());
intent.putExtra("barang_image_url", barang.getImageUrl());
context.startActivity(intent); // Mulai AddEditItemActivity
return true; // Event dikonsumsi
} else if (id == R.id.action_delete) { // Jika item "Hapus" diklik
// Panggil metode delete di MainActivity (melalui casting context)
if (context instanceof GaleriInvent) {
((GaleriInvent) context).deleteBarang(barang.getId());
} else {
Toast.makeText(context, "Tidak dapat menghapus barang", Toast.LENGTH_SHORT).show();
}
return true; // Event dikonsumsi
}
return false; // Event tidak dikonsumsi
}
});
popup.show(); // Tampilkan PopupMenu
}
}


8. Membuat item tampilan untuk RecyclerView

Membuat item tampilan untuk RecyclerView untuk melengkapi data masing masing item nya, buat layout baru dengan nama "item_list_inventaris"

<?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"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/recCardInvent"
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:layout_marginHorizontal="10dp"
android:layout_marginVertical="10dp"
app:cardCornerRadius="20dp"
app:cardElevation="8dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/imageViewItem"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:scaleType="centerCrop"
android:src="@drawable/logoplc"
app:shapeAppearanceOverlay="@style/roundedImageViewRounded" />

<TextView
android:id="@+id/textViewNamaBarang"
android:layout_width="wrap_content"
android:layout_height="22dp"
android:layout_marginStart="20dp"
android:maxWidth="280dp"
android:layout_marginTop="10dp"
android:layout_toEndOf="@id/imageViewItem"
android:text="Nama"
android:textColor="@color/black"
android:textSize="18sp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textViewJadwalMasuk"
android:text="Date"
android:textColor="@color/black"
android:textSize="14sp"
android:layout_toEndOf="@id/imageViewItem"
android:layout_below="@id/textViewNamaBarang"
android:layout_marginStart="20dp"
android:maxLines="1" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textViewdesck"
android:text="Desk"
android:maxWidth="300dp"
android:textColor="@color/black"
android:textSize="14sp"
android:layout_toEndOf="@id/imageViewItem"
android:layout_below="@id/textViewJadwalMasuk"
android:layout_marginStart="20dp"
android:maxLines="1"
android:layout_marginBottom="10dp"/>
</RelativeLayout>
</androidx.cardview.widget.CardView>


9. Membuat Menu

Membuat instance PopupMenu untuk edit dan delete data yang sudah di upload.Parameter pertama adalah Context, dan parameter kedua adalah View di mana popup akan di-anchor (biasanya itemView itu sendiri). oke mari buat kode nya pada resh menu, berinama item_option_menu

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_edit"
android:icon="@drawable/round_apps_24"
android:title="Edit" />
<item
android:id="@+id/action_delete"
android:icon="@drawable/round_apps_24"
android:title="Hapus" />
</menu>


Test Running App

Silahkan di coba untuk peluncuran proyek aplikasi kita apakah berhasil untuk CRUD isian data inventaris yang sudah kita buat dan Run aplikasi. Jangan lupa selalu memperhatikan kode id dan tanda yang mewakili data untuk input harus sesui

Demkianlah share kita untuk cara upload gambar dan text update dan tersimpan pada firebase database, semoga proses nya lancar. 

Posting Komentar

Komentar baru tidak diizinkan.*

Lebih baru Lebih lama

نموذج الاتصال