提问者:小点点

使用AlertDialog时无法更新和删除Firebase数据库中的数据


任何人,请帮助我解决我的问题,我使用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()方法中的问题,但我不知道具体在哪里。


共2个答案

匿名用户

您的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);
    }
    ...
  1. 从适配器中移动与适配器作业不直接相关的所有内容,并将其放入您的activity/片段:
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);
}}