How do I implements pull to refresh on binding fragment?

Viewed 57

This is my Fragment class

public class PengaduanFragment extends Fragment {

    private FragmentPengaduanBinding binding;
    private PengaduanAdapter adapter;
    private final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

    @Override
    public void onResume() {
        super.onResume();
        checkRole();
    }

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {


        binding = FragmentPengaduanBinding.inflate(inflater, container, false);
        return binding.getRoot();
    }

//get data from firestore
    private void checkRole() {
        FirebaseFirestore
                .getInstance()
                .collection("users")
                .document(user.getUid())
                .get()
                .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                    @SuppressLint("SetTextI18n")
                    @Override
                    public void onSuccess(DocumentSnapshot documentSnapshot) {
                        String role = "" + documentSnapshot.get("role");

                        if(role.equals("user")) {
                            binding.title.setText("Pengaduan Terkirim");
                            binding.keterangan.setText("Pengaduan Terkirim\nKe Admin SIMRS");
                        } else {
                            binding.title.setText("Pengaduan Masuk");
                            binding.keterangan.setVisibility(View.GONE);
                            //binding.keterangan.setText("Pengaduan Masuk\ndari Pegawai");
                        }

                        initRecyclerView(role);
                        initViewModel(role);

                    }
                });
    }

    private void initRecyclerView(String role) {
        binding.rvPengaduan.setLayoutManager(new LinearLayoutManager(getActivity()));
        adapter = new PengaduanAdapter(role, "");
        binding.rvPengaduan.setAdapter(adapter);
    }

    private void initViewModel(String role) {
        PengaduanViewModel viewModel = new ViewModelProvider(this).get(PengaduanViewModel.class);
        binding.progressBar.setVisibility(View.VISIBLE);
        if(role.equals("user")) {
            viewModel.setListPengaduanUserByUid(user.getUid());
        }
        else {
            viewModel.setListPengaduanAdminByUid(user.getUid());
        }
        viewModel.getPengaduan().observe(this, pengaduanModelArrayList -> {
            if (pengaduanModelArrayList.size() > 0) {
                if(role.equals("user")) {
                    binding.noDataUser.setVisibility(View.GONE);
                } else {
                    binding.noDataAdmin.setVisibility(View.GONE);
                }
                adapter.setData(pengaduanModelArrayList);
            } else {
                if(role.equals("user")) {
                    binding.noDataUser.setVisibility(View.VISIBLE);
                } else {
                    binding.noDataAdmin.setVisibility(View.VISIBLE);
                }
            }
            binding.progressBar.setVisibility(View.GONE);
        });
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }
}

This is my adapter

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

    private final ArrayList<PengaduanModel> listPengaduan = new ArrayList<>();

    String role, page;
    public PengaduanAdapter(String role, String page) {
        this.role = role;
        this.page = page;
    }

    @SuppressLint("NotifyDataSetChanged")
    public void setData(ArrayList<PengaduanModel> items) {
        listPengaduan.clear();
        listPengaduan.addAll(items);
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public PengaduanAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pengaduan, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull PengaduanAdapter.ViewHolder holder, int position) {
        holder.bind(listPengaduan.get(position), role, page, listPengaduan);
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView name, unit, lastMessage, date;
        ImageView image, check, delete;
        ConstraintLayout cv;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.name);
            unit = itemView.findViewById(R.id.unit);
            lastMessage = itemView.findViewById(R.id.lastMessage);
            date = itemView.findViewById(R.id.date);
            image = itemView.findViewById(R.id.image);
            check = itemView.findViewById(R.id.imageView);
            cv = itemView.findViewById(R.id.cv);
            delete = itemView.findViewById(R.id.delete);
        }

        @SuppressLint({"SetTextI18n", "NotifyDataSetChanged"})
        public void bind(PengaduanModel model, String role, String page, ArrayList<PengaduanModel> listPengaduan) {
            if(page.equals("dashboard")) {
                check.setVisibility(View.VISIBLE);
            } else {
                delete.setVisibility(View.GONE);
            }

            if(role.equals("user")){
                Glide.with(itemView.getContext())
                        .load(model.getAdminImage())
                        .into(image);
                name.setText(model.getAdminName());
                unit.setText("Unit: " +model.getAdminUnit());
            } else {
                Glide.with(itemView.getContext())
                        .load(model.getUserImage())
                        .into(image);
                name.setText(model.getUserName());
                unit.setText("Unit: " + model.getUserUnit());
            }
            lastMessage.setText("Pesan: " + model.getMessage());
            date.setText(model.getDate());
            cv.setOnClickListener(view -> {
                Intent intent = new Intent(itemView.getContext(), MessageActivity.class);
                intent.putExtra(MessageActivity.EXTRA_DATA, model);
                intent.putExtra(MessageActivity.ROLE, role);
                itemView.getContext().startActivity(intent);
            });

            delete.setOnClickListener(view -> {
                new AlertDialog.Builder(itemView.getContext())
                        .setTitle("Konfirmasi Laporan Selesai")
                        .setMessage("Anda yakin ingin menyelesaikan laporan ini?")
                        .setIcon(R.drawable.ic_baseline_warning_24)
                        .setPositiveButton("SETUJU", (dialogInterface, i) -> {
                            dialogInterface.dismiss();
                            ProgressDialog mProgressDialog = new ProgressDialog(itemView.getContext());

                            mProgressDialog.setMessage("Mohon tunggu hingga proses selesai...");
                            mProgressDialog.setCanceledOnTouchOutside(false);
                            mProgressDialog.show();

                            FirebaseFirestore
                                    .getInstance()
                                    .collection("report")
                                    .document(model.getUid())
                                    .update("status", "finish")
                                    .addOnCompleteListener(task -> {
                                        if(task.isSuccessful()) {
                                            //listPengaduan.remove(listPengaduan.get(getLayoutPosition()));
                                            delete.setColorFilter(Color.argb(255, 0, 255, 0));
                                            notifyDataSetChanged();
                                            mProgressDialog.dismiss();
                                            Toast.makeText(itemView.getContext(), "Berhasil menyelesaikan laporan.", Toast.LENGTH_SHORT).show();
                                        } else {
                                            mProgressDialog.dismiss();
                                            Toast.makeText(itemView.getContext(), "Gagal menyelesaikan laporan, mohon periksa internet anda dan coba lagi nanti.", Toast.LENGTH_SHORT).show();
                                        }
                                    });
                        })
                        .setNegativeButton("TIDAK", null)
                        .show();

            });

        }
    }
}

Please help me how to fix this?

1 Answers

You can make use of SwipeRefreshLayout to achieve your goals

Step 1 : Add the following dependency to your gradle(app):

dependencies {
    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
}

Step 2 : Wrap your RecyclerView with SwipeRefreshLayout in the XML Layout :

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swiperefresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RecyclerView
        android:id="@android:id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

Step 3:Call the setOnRefreshListener Method on the SwipeRefreshLayout :

mySwipeRefreshLayout.setOnRefreshListener(
    new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            Log.i(LOG_TAG, "onRefresh called from SwipeRefreshLayout");
            //Get data from Firestore by calling the respective function which in your case seems the following based on the role  :

        if(role.equals("user")) {
            viewModel.setListPengaduanUserByUid(user.getUid());
        }
        else {
            viewModel.setListPengaduanAdminByUid(user.getUid());
        }
     }
   }
);

Related