任何人,请帮助我解决我的问题,我使用Java编程语言和firebase实时数据库。 当我运行我的程序以显示recyclerview
时,它运行得很顺利,但是当我单击recyclerview
编辑并通过对话框alert删除数据时,我遇到了问题。 我正在使用AlertDialog/code>编辑数据,当我单击Simpan(保存)已更新的数据时,程序变为强制关闭且不会更改,当我单击Hapus(删除)
AlertDialog/code>中的数据时,也不会更改且不会删除数据。
这是我的firebase实时结构
这是我的碎片
package com.example.aplikasiskripsi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager.widget.ViewPager;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Toast;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.material.tabs.TabLayout;
import com.google.firebase.FirebaseApp;
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 java.util.ArrayList;
public class DaftarBrgFragment extends Fragment {
EditText edtTextSearch;
private ArrayList<BarangDB> daftarbarang;
private RecyclerView recyclerView;
private ItemAdapter adapter;
private DatabaseReference myRef;
private FirebaseDatabase fireIns;
private EditText kode_brg;
private EditText nama_brg;
private EditText hrg_jual;
private EditText stok_brg;
private Context context;
private LinearLayoutManager linearLayoutManager;
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_daftar_brg, container, false);
tabLayout = view.findViewById(R.id.tabLayout);
viewPager = view.findViewById(R.id.viewPager);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setOrientation(RecyclerView.VERTICAL);
recyclerView = view.findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(linearLayoutManager);
FirebaseApp.initializeApp(getActivity());
fireIns = FirebaseDatabase.getInstance();
myRef = fireIns.getReference();
myRef.child("Barang").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
daftarbarang = new ArrayList<>();
for (DataSnapshot mDataSnapshot : snapshot.getChildren()) {
BarangDB barang = mDataSnapshot.getValue(BarangDB.class);
barang.setNama(mDataSnapshot.getKey());
daftarbarang.add(barang);
}
adapter = new ItemAdapter(daftarbarang, getActivity());
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(getActivity(), error.getDetails() + " "
+ error.getMessage(), Toast.LENGTH_LONG).show();
}
});
edtTextSearch = view.findViewById(R.id.edtTextSearch);
edtTextSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
@Override
public void afterTextChanged(Editable s) {
filter(s.toString());
}
});
return view;
}
private void filter(String text){
ArrayList<BarangDB> filteredList = new ArrayList<>();
for (BarangDB item : daftarbarang){
if (item.getNama().toLowerCase().contains(text.toLowerCase())
&& item.getHarga().toLowerCase().contains(text.toLowerCase())
&& item.getStok().toLowerCase().contains(text.toLowerCase())){
filteredList.add(item);
}
}
adapter.filterList(filteredList);
}
}
这是我的适配器
package com.example.aplikasiskripsi;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DatabaseReference;
import java.util.ArrayList;
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.MyViewHolder> {
private ArrayList<BarangDB> daftarbarang;
Context context;
private ProgressDialog progressDialog;
private FirebaseDatabase database;
private DatabaseReference myRef;
public ItemAdapter(ArrayList<BarangDB> b, Context context){
this.context = context;
this.daftarbarang = b;
progressDialog = new ProgressDialog(context);
progressDialog.setTitle("Mohon tunggu");
progressDialog.setCanceledOnTouchOutside(false);
}
class MyViewHolder extends RecyclerView.ViewHolder{
TextView kd_brg,nama_brg,hrg_jual,stok_brg;
CardView cvbrg;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
kd_brg = itemView.findViewById(R.id.kd_brg);
nama_brg = itemView.findViewById(R.id.nama_brg);
hrg_jual = itemView.findViewById(R.id.hrg_jual);
stok_brg = itemView.findViewById(R.id.stok_brg);
cvbrg = itemView.findViewById(R.id.cvbrg);
}
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_item,parent,false));
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
final BarangDB barang = daftarbarang.get(position);
holder.kd_brg.setText("Kode Barang: " + daftarbarang.get(position).getKode());
holder.nama_brg.setText("Nama Barang: " + daftarbarang.get(position).getNama());
holder.hrg_jual.setText("Harga Jual: "+ daftarbarang.get(position).getHarga());
holder.stok_brg.setText("Stok: " + daftarbarang.get(position).getStok());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onDataClick(barang);
}
});
}
private void onDataClick(final BarangDB barang) {
String[] options = {"Edit","Hapus"};
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Pilih Aksi").setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
if (i==0){
dialogUpdateBarang(barang);
}else if (i==1){
hapusDataBarang(barang);
}
}
})
.show();
}
private void hapusDataBarang(BarangDB barang) {
if (myRef != null) {
myRef.child("Barang").child(barang.getKey()).setValue(null).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(context, "Data dihapus", Toast.LENGTH_LONG).show();
}
});
}
}
private void dialogUpdateBarang(final BarangDB barang) {
final EditText kode_brg,nama_brg,hrg_jual,stok_brg;
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Edit Data");
View view;
view = LayoutInflater.from(context).inflate(R.layout.layout_editbarang, null);
kode_brg = view.findViewById(R.id.kode_brg);
nama_brg = view.findViewById(R.id.nama_brg);
hrg_jual = view.findViewById(R.id.hrg_jual);
stok_brg = view.findViewById(R.id.stok_brg);
kode_brg.setText(barang.getKode());
nama_brg.setText(barang.getNama());
hrg_jual.setText(barang.getHarga());
stok_brg.setText(barang.getStok());
builder.setView(view);
if (barang != null) {
builder.setPositiveButton("SIMPAN", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
barang.setKode(kode_brg.getText().toString());
barang.setNama(nama_brg.getText().toString());
barang.setHarga(hrg_jual.getText().toString());
barang.setStok(stok_brg.getText().toString());
updateDataBarang(barang);
}
});
}
builder.setNegativeButton("BATAL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
Dialog dialog = builder.create();
dialog.show();
}
private void updateDataBarang(BarangDB barang) {
myRef.child("Barang")
.child(barang.getKey())
.setValue(barang).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(context, "Data berhasil di update", Toast.LENGTH_LONG).show();
}
});
}
@Override
public int getItemCount() {
return daftarbarang.size();
}
public void filterList(ArrayList<BarangDB> filteredList){
daftarbarang = filteredList;
notifyDataSetChanged();
}
}
这是数据库模型
package com.example.aplikasiskripsi;
import com.google.firebase.database.IgnoreExtraProperties;
import java.io.Serializable;
@IgnoreExtraProperties
public class BarangDB implements Serializable {
private String kode;
private String nama;
private String harga;
private String stok;
private String key;
public BarangDB(){ }
public BarangDB (String kode, String nama, String harga, String stok){
this.kode = kode;
this.nama = nama;
this.harga = harga;
this.stok = stok;
}
public String getKey() { return key;}
public void setKey(String key) { this.key = key; }
public String getKode() { return kode;}
public void setKode(String kode) { this.kode = kode; }
public String getNama() { return nama; }
public void setNama(String nama) { this.nama = nama; }
public String getHarga() { return harga; }
public void setHarga(String harga) { this.harga = harga; }
public String getStok() { return stok; }
public void setStok(String stok) { this.stok = stok; }
@Override
public String toString() {
return " "+kode+"\n" + " "+nama +"\n" + " "+harga + "\n" + " "+stok;
}
}
这是在片段中显示Recyclerview的屏幕截图
这是单击回收查看时的屏幕截图报警对话框
这是编辑数据的屏幕截图警报对话框
logcat
E/LoadedApk: Unable to instantiate appComponentFactory
java.lang.ClassNotFoundException: Didn't find class "com.example.aplikasiskripsi.Skripsi" on
path: DexPathList[[zip file "/data/app/com.example.aplikasiskripsi-wgNbUJpQodXMT-tWWHK35g==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.aplikasiskripsi-wgNbUJpQodXMT-tWWHK35g==/lib/arm64, /system/lib64, /system/vendor/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.app.LoadedApk.createAppFactory(LoadedApk.java:217)
at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:722)
at android.app.LoadedApk.getClassLoader(LoadedApk.java:801)
at android.app.LoadedApk.getResources(LoadedApk.java:1023)
at android.app.ContextImpl.createAppContext(ContextImpl.java:2345)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5780)
at android.app.ActivityThread.access$1100(ActivityThread.java:200)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1660)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6762)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
我认为UpdateDatabarang()
方法和HapusDatabarang()
方法中的问题,但我不知道具体在哪里。
您的ItemAdapter
有一个私有成员private DatabaseReferenceMyRef
,但从未为它分配值。 因此,当您单击delete(hapus)时,不会发生任何变化,因为HapusDatabarang
检查MyRef
是否不为空:
private void hapusDataBarang(BarangDB barang) {
if (myRef != null) { // You never pass this if statement
...
}
}
您的UpdateDatabarang
不检查MyRef
是否已初始化。 所以只要单击save(simpan),应用程序就会崩溃。
更新适配器以接受多一个参数:
...
private DatabaseReference myRef;
public ItemAdapter(ArrayList<BarangDB> b, Context context, DatabaseReference dbReference) {
this.context = context;
this.daftarbarang = b;
myRef = dbReference; // Required
progressDialog = new ProgressDialog(context);
progressDialog.setTitle("Mohon tunggu");
progressDialog.setCanceledOnTouchOutside(false);
}
...
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.MyViewHolder> {
private ArrayList<BarangDB> daftarbarang;
public ItemAdapter(ArrayList<BarangDB> b){
this.daftarbarang = b;
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView kd_brg,nama_brg,hrg_jual,stok_brg;
CardView cvbrg;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
kd_brg = itemView.findViewById(R.id.kd_brg);
nama_brg = itemView.findViewById(R.id.nama_brg);
hrg_jual = itemView.findViewById(R.id.hrg_jual);
stok_brg = itemView.findViewById(R.id.stok_brg);
cvbrg = itemView.findViewById(R.id.cvbrg);
}
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_item,parent,false));
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
final BarangDB barang = daftarbarang.get(position);
holder.kd_brg.setText("Kode Barang: " + daftarbarang.get(position).getKode());
holder.nama_brg.setText("Nama Barang: " + daftarbarang.get(position).getNama());
holder.hrg_jual.setText("Harga Jual: "+ daftarbarang.get(position).getHarga());
holder.stok_brg.setText("Stok: " + daftarbarang.get(position).getStok());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// This listener will be created on step 3 and implemented on step 4
listener.onDataClick(barang);
}
});
}
@Override
public int getItemCount() {
return daftarbarang.size();
}
public void filterList(ArrayList<BarangDB> filteredList){
daftarbarang = filteredList;
notifyDataSetChanged();
}
}
public class DaftarBrgFragment extends Fragment {
...
public void onDataClick(final BarangDB barang) {
String[] options = {"Edit","Hapus"};
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
builder.setTitle("Pilih Aksi").setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
if (i==0){
dialogUpdateBarang(barang);
}else if (i==1){
hapusDataBarang(barang);
}
}
})
.show();
}
private void hapusDataBarang(BarangDB barang) {
myRef.child("Barang")
.child(barang.getKey())
.setValue(null).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(requireContext(), "Data dihapus", Toast.LENGTH_LONG).show();
}
});
}
}
private void dialogUpdateBarang(final BarangDB barang) {
final EditText kode_brg,nama_brg,hrg_jual,stok_brg;
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
builder.setTitle("Edit Data");
View view = LayoutInflater.from(requireContext()).inflate(R.layout.layout_editbarang, null);
kode_brg = view.findViewById(R.id.kode_brg);
nama_brg = view.findViewById(R.id.nama_brg);
hrg_jual = view.findViewById(R.id.hrg_jual);
stok_brg = view.findViewById(R.id.stok_brg);
kode_brg.setText(barang.getKode());
nama_brg.setText(barang.getNama());
hrg_jual.setText(barang.getHarga());
stok_brg.setText(barang.getStok());
builder.setView(view);
if (barang != null) {
builder.setPositiveButton("SIMPAN", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
barang.setKode(kode_brg.getText().toString());
barang.setNama(nama_brg.getText().toString());
barang.setHarga(hrg_jual.getText().toString());
barang.setStok(stok_brg.getText().toString());
updateDataBarang(barang);
}
});
}
builder.setNegativeButton("BATAL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
Dialog dialog = builder.create();
dialog.show();
}
private void updateDataBarang(BarangDB barang) {
myRef.child("Barang")
.child(barang.getKey())
.setValue(barang).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(requireContext(), "Data berhasil di update", Toast.LENGTH_LONG).show();
}
});
}
...
}
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.MyViewHolder> {
private ItemClickListener listener;
private ArrayList<BarangDB> daftarbarang;
interface ItemClickListener {
void onDataClicked(BarangDB barang);
}
public ItemAdapter(ArrayList<BarangDB> b, ItemClickListener listener){
this.daftarbarang = b;
this.listener = listener;
}
...
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
final BarangDB barang = daftarbarang.get(position);
...
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onDataClick(barang); // Here is how we use this listener
}
});
}
}
public class DaftarBrgFragment extends Fragment implements ItemAdapter.ItemClickListener {
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_daftar_brg, container, false);
...
myRef.child("Barang").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
daftarbarang = new ArrayList<>();
for (DataSnapshot mDataSnapshot : snapshot.getChildren()) {
BarangDB barang = mDataSnapshot.getValue(BarangDB.class);
barang.setNama(mDataSnapshot.getKey());
daftarbarang.add(barang);
}
adapter = new ItemAdapter(daftarbarang, DaftarBrgFragment.this);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
...
});
...
return view;
}
// Mark this method as @Override
@Override
public void onDataClick(final BarangDB barang) {
...
}
...
}
将multiDexEnabled true添加为您的gradle配置中的defaultConfig{multiDexEnabled true}:
defaultConfig {
applicationId "com.your.application"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
并添加此依赖项:
implementation 'androidx.multidex:multidex:2.0.1'
import android.content.Context;
import androidx.multidex.MultiDex;
import androidx.multidex.MultiDexApplication;
public class YourApplication extends MultiDexApplication {
@Override
protected void attachBaseContext(Context base) {
MultiDex.install(this);
super.attachBaseContext(base);
}}