-1

Mastah

I'm trying to read data from my FireBase Realtime DataBase. I'm using Recycler view in Fragment to read it. When I'm coding there is no sign of error. But When I try to run the Code, it shows error like this :

2021-04-25 20:37:21.060 20896-20896/com.kuplay.storingdata E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.kuplay.storingdata, PID: 20896
java.lang.ClassCastException: com.kuplay.storingdata.ui.MainActivity cannot be cast to com.kuplay.storingdata.Adapter.RecyclerViewAdapter$dataListener
    at com.kuplay.storingdata.Adapter.RecyclerViewAdapter.<init>(RecyclerViewAdapter.java:39)
    at com.kuplay.storingdata.Fragment.data.DataFragment$1.onDataChange(DataFragment.java:80)
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
    at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:239)
    at android.app.ActivityThread.main(ActivityThread.java:8179)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:626)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1015)

I've tried many ways and tried searching many refference from google. But it doesn't work.

can Any Body help me to solve this error... Cause I'm still a noob.

Here is My Code :

DataFragment.java

package com.kuplay.storingdata.Fragment.data;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.firebase.auth.FirebaseAuth;
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.kuplay.storingdata.Adapter.RecyclerViewAdapter;
import com.kuplay.storingdata.Model.data_finance;
import com.kuplay.storingdata.R;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.Objects;

public class DataFragment extends Fragment {
    private RecyclerView recyclerView;
    private RecyclerViewAdapter adapter;
    private RecyclerView.LayoutManager layoutManager;

    private FirebaseAuth auth;
    private DatabaseReference reference;
    private ArrayList<data_finance> dFinance;

    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_data, container, false);
        recyclerView = root.findViewById(R.id.data_list);
        auth = FirebaseAuth.getInstance();

        MyRecyclerView();
        GetData();
        return root;
    }

    private void MyRecyclerView(){
        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);

        DividerItemDecoration itemDecoration = new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL);
        itemDecoration.setDrawable(Objects.requireNonNull(ContextCompat.getDrawable(getActivity(), R.drawable.line)));
        recyclerView.addItemDecoration(itemDecoration);
    }

    private void GetData(){
        reference = FirebaseDatabase.getInstance().getReference();
        reference.child("Finance");
        reference.child(Objects.requireNonNull(auth.getUid()));
        reference.child("Data");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NotNull DataSnapshot dataSnapshot) {
                //Inisialisasi ArrayList
                dFinance = new ArrayList<>();

                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    data_finance finance = snapshot.getValue(data_finance.class);

                    assert finance != null;
                    finance.setId(snapshot.getKey());
                    dFinance.add(finance);
                }

                adapter = new RecyclerViewAdapter(dFinance, getActivity());
                recyclerView.setAdapter(adapter);
            }

            @Override
            public void onCancelled(@NotNull DatabaseError databaseError) {

                Toast.makeText(getActivity(), "Data Gagal Dimuat", Toast.LENGTH_LONG).show();
                Log.e("MyListActivity", databaseError.getDetails() + " " + databaseError.getMessage());
            }
        });
    }
}

RecyclerViewAdapter.java

package com.kuplay.storingdata.Adapter;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.RecyclerView;

import com.kuplay.storingdata.Model.data_finance;
import com.kuplay.storingdata.R;
import com.kuplay.storingdata.ui.updateData;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{

    private ArrayList<data_finance> listFinance;
    private Context context;

    public interface dataListener{
        void onDeleteData(data_finance data, int position);
    }

    dataListener listener;

    public RecyclerViewAdapter(ArrayList<data_finance> listFinance, Context context) {
        this.listFinance = listFinance;
        this.context = context;
        listener = (dataListener) context;
    }

    static class ViewHolder extends RecyclerView.ViewHolder{

        private TextView Nama;
        private TextView Pemasukan;
        private TextView Pengeluaran;
        private TextView Waktu;
        private LinearLayout lst_item;

        ViewHolder(View itemView) {
            super(itemView);

            Nama = itemView.findViewById(R.id.tbl_nama);
            Pemasukan = itemView.findViewById(R.id.tbl_pemasukan);
            Pengeluaran = itemView.findViewById(R.id.tbl_pengeluaran);
            Waktu = itemView.findViewById(R.id.tbl_waktu);
            LinearLayout tbl_header = itemView.findViewById(R.id.tbl_header);
            lst_item = itemView.findViewById(R.id.lst_item);
        }
    }

    @NotNull
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View V = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_design, parent, false);
        return new ViewHolder(V);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        final String Nama = listFinance.get(position).getNama();
        final String Pemasukan = listFinance.get(position).getPemasukan();
        final String Pengeluaran = listFinance.get(position).getPengeluaran();
        final String Waktu = listFinance.get(position).getWaktu();

        holder.Nama.setText(Nama);
        holder.Pemasukan.setText(Pemasukan);
        holder.Pengeluaran.setText(Pengeluaran);
        holder.Waktu.setText(Waktu);

        holder.lst_item.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(final View view) {
                final String[] action = {"Update", "Delete"};
                AlertDialog.Builder alert = new AlertDialog.Builder(view.getContext());
                alert.setItems(action,  new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int i) {
                        switch (i){
                            case 0:
                                Bundle bundle = new Bundle();
                                bundle.putString("dataNama", listFinance.get(position).getNama());
                                bundle.putString("dataPemasukan", listFinance.get(position).getPemasukan());
                                bundle.putString("dataPengeluaran", listFinance.get(position).getPengeluaran());
                                bundle.putString("dataWaktu", listFinance.get(position).getWaktu());
                                bundle.putString("getPrimaryKey", listFinance.get(position).getId());
                                Intent intent = new Intent(view.getContext(), updateData.class);
                                intent.putExtras(bundle);
                                context.startActivity(intent);
                                break;
                            case 1:
                                listener.onDeleteData(listFinance.get(position), position);
                                break;
                        }
                    }
                });
                alert.create();
                alert.show();
                return true;
            }
        });
    }

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

}

MainActivity.java

package com.kuplay.storingdata.ui;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.MenuItem;
import android.view.View;
import android.view.Menu;
import android.widget.Toast;

import com.firebase.ui.auth.AuthUI;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.navigation.NavigationView;
import com.google.firebase.auth.FirebaseAuth;
import com.kuplay.storingdata.Fragment.input.InputFragment;
import com.kuplay.storingdata.R;

import androidx.annotation.NonNull;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

public class MainActivity extends AppCompatActivity {

    private AppBarConfiguration mAppBarConfiguration;
    public FirebaseAuth auth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);

        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_input, R.id.nav_data, R.id.nav_cashflow)
                .setDrawerLayout(drawer)
                .build();

        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.logout:
                AuthUI.getInstance()
                        .signOut(this)
                        .addOnCompleteListener(new OnCompleteListener() {
                            @Override
                            public void onComplete(@NonNull Task task) {
                                Toast.makeText(MainActivity.this, "Logout Berhasil", Toast.LENGTH_SHORT).show();
                                Intent home = new Intent(MainActivity.this, StartActivity.class);
                                startActivity(home);
                                finish();
                            }
                        });
                return true;
        }
        return false;
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }
}

Please somebody help me to solve this error ;(

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807

2 Answers2

0
 adapter = new RecyclerViewAdapter(dFinance, getActivity());

There you set the context variable within RecyclerViewAdapter, that is as I see it the MainActivity (getActivity()).

public RecyclerViewAdapter(ArrayList<data_finance> listFinance, Context context) {
    this.listFinance = listFinance;
    this.context = context;
    listener = (dataListener) context;
}

Here you try to cast the context (MainActivity) to a dataListener type, that is a mismatch as indicated by the error "java.lang.ClassCastException: com.kuplay.storingdata.ui.MainActivity cannot be cast to com.kuplay.storingdata.Adapter.RecyclerViewAdapter$dataListener"

Can't you just let the MainActivity implement the dataListener as in;

class MainActivity ... implements RecyclerViewAdapter.dataListener

and then simply overwrite the interface functions?

Eric.1
  • 71
  • 3
0

MainActivity is not implementing the MainActivity dataListener interface but you are casting activity to dataListener in the adapter which is wrong actually. Either you implement dataListener in MainActivity or Fragment and pass the actual argument.

Ramesh Yankati
  • 1,197
  • 9
  • 13