Home > other >  Nothing happens after I click item in recyclerview even after using interface
Nothing happens after I click item in recyclerview even after using interface

Time:09-22

I have made an android application using java, and I have made a click listener interface but nothing seems to happen and I can't figure out what is wrong with my code. Please help.

Following is the code of my recyclerViewAdapter:

package com.example.ashwamedh.adapter;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

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

import com.example.ashwamedh.R;
import com.example.ashwamedh.model.AdminConfirmation;
import com.example.ashwamedh.model.Attendance;
import com.example.ashwamedh.model.Confirmation;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.List;
import java.util.Objects;

public class ManageAttendanceRecyclerViewAdapter extends RecyclerView.Adapter<ManageAttendanceRecyclerViewAdapter.ViewHolder> {
    private List<Confirmation> practiceList;
    private Context context;
    private OnAttendanceClickListener onAttendanceClickListener;

    private CollectionReference collectionReference = FirebaseFirestore.getInstance().collection("Users");

    public ManageAttendanceRecyclerViewAdapter(List<Confirmation> practiceList, Context context, OnAttendanceClickListener onAttendanceClickListener) {
        this.practiceList = practiceList;
        this.context = context;
        this.onAttendanceClickListener = onAttendanceClickListener;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ManageAttendanceRecyclerViewAdapter.ViewHolder holder, int position) {
        Confirmation confirmation = practiceList.get(position);
        holder.nameTextView.setText(confirmation.getUsername());
        if (confirmation.getRemarkOrReason() == "") {
            holder.remarkOrReasonTextView.setText("null");
        }else {
            holder.remarkOrReasonTextView.setText(confirmation.getRemarkOrReason());
        }
        if (Objects.equals(confirmation.getConfirmation(), "present")) {
            holder.confirmation.setImageResource(R.drawable.ic_baseline_check_24);
        } else if (Objects.equals(confirmation.getConfirmation(), "absent")){
            holder.confirmation.setImageResource(R.drawable.ic_baseline_close_24);
        }
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView nameTextView;
        private ImageView confirmation;
        private TextView remarkOrReasonTextView;

        OnAttendanceClickListener onAttendanceClickListener;

        public ViewHolder(@NonNull View itemView, Context ctx) {
            super(itemView);

            this.onAttendanceClickListener = ManageAttendanceRecyclerViewAdapter.this.onAttendanceClickListener;

            context = ctx;
            nameTextView = itemView.findViewById(R.id.manage_attendance_name_textview);
            confirmation = itemView.findViewById(R.id.manage_attendance_confirmation);
            remarkOrReasonTextView = itemView.findViewById(R.id.manage_attendance_remark_reason_textview);
        }

        @Override
        public void onClick(View view) {
            int id = view.getId();
            switch (id){
                case R.id.manage_attendance_row:
                Log.d("from recycler view", "onClick: "   "row clicked");
                Confirmation confirmation = practiceList.get(getAdapterPosition());
                String userId = confirmation.getUserId();
                onAttendanceClickListener.OnAttendanceClick(userId);
            }
        }
    }
}

Following is the code of OnAttendanceClickListener:

package com.example.ashwamedh.adapter;

public interface OnAttendanceClickListener {
    void OnAttendanceClick(String userId);
}

Following is the code of the activity where the recycler view is used and the interface implemented:

package com.example.ashwamedh;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

import com.example.ashwamedh.adapter.ManageAttendanceRecyclerViewAdapter;
import com.example.ashwamedh.adapter.OnAttendanceClickListener;
import com.example.ashwamedh.model.Confirmation;
import com.example.ashwamedh.util.UserApi;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects;

public class ManagePracticeConfirmationActivity extends AppCompatActivity implements OnAttendanceClickListener {
    private static final String TAG = "PRACTICE_CONFIRMATION";
    private RecyclerView recyclerView;
    private BottomNavigationView bottomNavigationView;
    private CardView markAttendanceCardView;
    private FloatingActionButton presentFab;
    private FloatingActionButton absentFab;
    private Button updateButton;
    private TextView noPracticeTextView;
    private ImageButton signOut;

    private Boolean isAdmin;
    private String attendance;

    private ManageAttendanceRecyclerViewAdapter manageAttendanceRecyclerViewAdapter;
    private String practiceDate;

    private List<Confirmation> practiceList;

    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private CollectionReference collectionReference = db.collection("Confirmations");
    private CollectionReference userCollection = db.collection("Users");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_manage_practice_confirmation);

        Objects.requireNonNull(getSupportActionBar()).hide();

        practiceList = new ArrayList<>();

        recyclerView = findViewById(R.id.manage_attendance_recycler_view);
        bottomNavigationView = findViewById(R.id.bottomNavigationView);
        markAttendanceCardView = findViewById(R.id.mark_attendance_cardView);
        presentFab = findViewById(R.id.present_fab);
        absentFab = findViewById(R.id.absent_fab);
        updateButton = findViewById(R.id.update_attendance_button);
        noPracticeTextView = findViewById(R.id.no_practice_textView);
        signOut = findViewById(R.id.signOut_manage_attendance);

        absentFab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(ManagePracticeConfirmationActivity.this, R.color.absent_button_color)));
        presentFab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(ManagePracticeConfirmationActivity.this, R.color.present_button_color)));


        bottomNavigationView.setSelectedItemId(R.id.manage_practice_confirmation_button);

        markAttendanceCardView.setVisibility(View.INVISIBLE);

        UserApi userApi = UserApi.getInstance();
        isAdmin = Objects.equals(userApi.getUsername(), "ADMIN");

        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        attendance = "";

        Date today = Calendar.getInstance().getTime();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
        practiceDate = simpleDateFormat.format(today);


        Log.d(TAG, "onCreate: "   Calendar.DAY_OF_WEEK);
        if (Calendar.getInstance().get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY
        || Calendar.getInstance().get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
            recyclerView.setVisibility(View.INVISIBLE);
            noPracticeTextView.setVisibility(View.VISIBLE);
        } else {
            recyclerView.setVisibility(View.VISIBLE);
            noPracticeTextView.setVisibility(View.INVISIBLE);
        }

        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                if (item.getItemId() == R.id.home_button) {
                    Intent intent = new Intent(ManagePracticeConfirmationActivity.this, Dashboard.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                    finish();
                    return true;
                }
                if (item.getItemId() == R.id.council_button) {
                    Intent intent = new Intent(ManagePracticeConfirmationActivity.this, CouncilActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                    finish();
                    return true;
                }
                if (item.getItemId() == R.id.attendance_button) {
                    Intent intent = new Intent(ManagePracticeConfirmationActivity.this, BatchmateAttendance.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                    finish();
                    return true;
                }
                if (item.getItemId() == R.id.manage_practice_confirmation_button) {
                    return true;
                }
                return false;
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Date today = Calendar.getInstance().getTime();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
        practiceDate = simpleDateFormat.format(today);
        collectionReference.whereEqualTo("practiceDate", practiceDate)
                .get()
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                        if (!queryDocumentSnapshots.isEmpty()) {
                            for (QueryDocumentSnapshot snapshot : queryDocumentSnapshots) {
                                Confirmation confirmation = snapshot.toObject(Confirmation.class);
                                practiceList.add(confirmation);
                            }


                            manageAttendanceRecyclerViewAdapter = new ManageAttendanceRecyclerViewAdapter(practiceList,
                                    ManagePracticeConfirmationActivity.this,
                                    ManagePracticeConfirmationActivity.this);
                            recyclerView.setAdapter(manageAttendanceRecyclerViewAdapter);
                            manageAttendanceRecyclerViewAdapter.notifyDataSetChanged();

                        }
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {

                    }
                });
    }

    @Override
    public void OnAttendanceClick(String userId) {
        Log.d(TAG, "OnAttendanceClick: "  isAdmin);
        UserApi userApi = UserApi.getInstance();
        isAdmin = Objects.equals(userApi.getUsername(), "ADMIN");
        if (isAdmin) {
            markAttendanceCardView.setVisibility(View.VISIBLE);
            presentFab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    attendance = "present";
                    presentFab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(ManagePracticeConfirmationActivity.this, R.color.selected_button_color)));
                    absentFab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(ManagePracticeConfirmationActivity.this, R.color.absent_button_color)));
                }
            });
            absentFab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    attendance = "absent";
                    absentFab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(ManagePracticeConfirmationActivity.this, R.color.selected_button_color)));
                    presentFab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(ManagePracticeConfirmationActivity.this, R.color.present_button_color)));
                }
            });
            updateButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Confirmation confirmation = new Confirmation();
                    confirmation.setUserId(userId);
                    confirmation.setConfirmation(attendance);
                    confirmation.setPracticeDate(practiceDate);
                    if (Objects.equals(attendance, "present")) {
                        confirmation.setRemarkOrReason("PRESENT ON PRACTICE");
                    } else if (Objects.equals(attendance, "absent")){
                        confirmation.setRemarkOrReason("ABSENT ON PRACTICE");
                    }
                    SimpleDateFormat documentDateFormat = new SimpleDateFormat("dd_MM_yyyy");
                    String docDate = documentDateFormat.format(practiceDate);
                    String docAddress = userId "_" docDate;
                    collectionReference.document(docAddress)
                            .set(confirmation)
                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void unused) {
                                    Toast.makeText(ManagePracticeConfirmationActivity.this, "Attendance marked!", Toast.LENGTH_SHORT)
                                            .show();
                                }
                            });
                    attendance = "";
                    absentFab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(ManagePracticeConfirmationActivity.this, R.color.absent_button_color)));
                    presentFab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(ManagePracticeConfirmationActivity.this, R.color.present_button_color)));
                    markAttendanceCardView.setVisibility(View.INVISIBLE);
                    manageAttendanceRecyclerViewAdapter.notifyDataSetChanged();
                }
            });
        } else {
            Toast.makeText(ManagePracticeConfirmationActivity.this, "Only admins can mark attendance!", Toast.LENGTH_SHORT)
                    .show();
        }
    }
}

Please help me I am clueless of where is the error

CodePudding user response:

RecyclerView clicks doesn't work like that. Firstly you should right click event in onBindViewHolder

holder.itemView.setOnClickListener(view -> onAttendanceClickListener.OnAttendanceClick(userId));

Put this code in your onBindViewHolder and you are good to go! You will receive click events in Activity.

  • Related