मैं प्लेसमेंट के आधार पर एक ऐप विकसित कर रहा हूं। मैंने इसके लिए फायरबेस रीयलटाइम डेटाबेस का उपयोग किया है। मैं "जॉब पोस्ट" डीबी और "एप्लाइड कैंडिडेट" डीबी से कंपनी के नाम का मिलान कर रहा हूं, ताकि उस विशेष कंपनी के लिए केवल आवेदन किए गए उम्मीदवारों का विवरण प्रदर्शित किया जा सके। सब कुछ ठीक काम कर रहा है, लेकिन समस्या यह है कि रिसाइकलव्यू का डेटा तभी लोड होता है जब बटन दूसरी बार क्लिक किया जाता है।

public class AppliedCandidateActivity extends AppCompatActivity {
    Toolbar toolbarAppliedcandidate;
    RecyclerView rvAppliedCandidate;
    List<appliedData> ls;
    String compNameposted;

    AppCandidateAdapter adapter;

    DatabaseReference dbJobPost,dbAppliedCandidate;

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

        toolbarAppliedcandidate = findViewById(R.id.toolbarAppliedcandidate);
        rvAppliedCandidate = findViewById(R.id.rvAppliedCandidate);

        setSupportActionBar(toolbarAppliedcandidate);
        getSupportActionBar().setTitle("Applied Candidate");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

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

        ls = new ArrayList<>();
        adapter = new AppCandidateAdapter(getApplicationContext(),ls);
        rvAppliedCandidate.setAdapter(adapter);

        getCompany();
        matchCompanyName();
}

    void getCompany()
    {
        //To retrieve company name
        dbJobPost = FirebaseDatabase.getInstance().getReference("Job Post").child(FirebaseAuth.getInstance().getCurrentUser().getUid());

        dbJobPost.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot ds : snapshot.getChildren())
                {
                    PostJobData postJobData = ds.getValue(PostJobData.class);
                    compNameposted = postJobData.getCompName().toString();

                    //Toast.makeText(getApplicationContext(),postJobData.getCompName(),Toast.LENGTH_LONG).show();

                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });

    }

    void matchCompanyName()
    {
        //To retrieve data of applied candidate for particular company
        dbAppliedCandidate = FirebaseDatabase.getInstance().getReference("Applied Candidate");

        dbAppliedCandidate.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot ds: snapshot.getChildren())
                {
                    for (DataSnapshot ds1 : ds.getChildren())
                    {
                        appliedData data = ds1.getValue(appliedData.class);
                        String compName = data.getCompName().toString();
                        //Toast.makeText(getApplicationContext(),compName,Toast.LENGTH_LONG).show();

                        if(compName.equals(compNameposted))
                        {

                            ls.add(data);
                        }
                        else if(ls.isEmpty()== true){
                            Toasty.info(AppliedCandidateActivity.this,"No One Applied Yet!!",Toast.LENGTH_LONG,true).show();
                        }

                    }

                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

    public class AppCandidateAdapter extends RecyclerView.Adapter<AppCandidateAdapter.AppCandidateViewHolder>{
        List<appliedData> appliedDataList;
        Context context;

        public  AppCandidateAdapter(Context mcontext,List list){
            this.context = mcontext;
            this.appliedDataList = list;

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

        @Override
        public void onBindViewHolder(@NonNull AppCandidateViewHolder holder, int position) {
            appliedData data = appliedDataList.get(position);
            holder.tvCandidateName.setText(data.getName());
            holder.tvCandidateAppliedPost.setText(data.getPosition());
            holder.tvCandidateQual.setText(data.getQualification());
            holder.tvCandidateSkills.setText(data.getSkills());
        }

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

        class AppCandidateViewHolder extends RecyclerView.ViewHolder{
            TextView tvCandidateName,tvCandidateAppliedPost,tvCandidateQual,tvCandidateSkills;
            Button btnDeleteCandidate,btnSendMail;

            public AppCandidateViewHolder(@NonNull View itemView) {
                super(itemView);

                tvCandidateName = itemView.findViewById(R.id.tvCandidateName);
                tvCandidateAppliedPost = itemView.findViewById(R.id.tvCandidateAppliedPost);
                tvCandidateQual = itemView.findViewById(R.id.tvCandidateQual);
                tvCandidateSkills = itemView.findViewById(R.id.tvCandidateSkills);
                btnDeleteCandidate = itemView.findViewById(R.id.btnDeleteCandidate);
                btnSendMail = itemView.findViewById(R.id.btnSendMail);


            }
        }
    }


}
0
Nishmitha Naik 23 पद 2020, 16:37
1
जब आप सूची में डेटा जोड़ रहे हों, यानी लूप के बाद, आपको एडॉप्टर को matchCompanyName से onDataChange के अंदर से सूचित करना होगा।
 – 
ADM
23 पद 2020, 16:41
कृपया onCancelled को कभी भी खाली न छोड़ें, क्योंकि आप इस तरह से संभावित त्रुटियों को अनदेखा कर रहे हैं। इसका न्यूनतम कार्यान्वयन होना चाहिए: public void onCancelled(@NonNull DatabaseError databaseError) { throw databaseError.toException(); }
 – 
Frank van Puffelen
23 पद 2020, 19:00

1 उत्तर

सबसे बढ़िया उत्तर

यह मानते हुए कि आपका onDataChange करता है कॉल किया जाता है, स्नैपशॉट से PostJobData डेटा को सफलतापूर्वक पढ़ता है, और इसे ls में जोड़ता है, आप Android को यह नहीं बता रहे हैं कि सूची बदल गया है। केवल एक बार जब आप परिवर्तन के एडॉप्टर को सूचित करते हैं, तो क्या यह दृश्य को फिर से प्रस्तुत करेगा।

dbJobPost = FirebaseDatabase.getInstance().getReference("Job Post").child(FirebaseAuth.getInstance().getCurrentUser().getUid());

dbJobPost.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot ds : snapshot.getChildren()) {
            PostJobData postJobData = ds.getValue(PostJobData.class);
            compNameposted = postJobData.getCompName().toString();
        }
        adapter.notifyDataSetChanged(); // notify the adapter
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException(); // never ignore errors
    }
});
0
Frank van Puffelen 23 पद 2020, 19:03
यह ठीक से काम नहीं कर रहा है और अन्य लूप भी एक साथ निष्पादित हो रहे हैं। वही समस्या जारी है
 – 
Nishmitha Naik
24 पद 2020, 16:40
आपको "यह काम नहीं कर रहा" से थोड़ा बेहतर करना होगा। क्या आपके onChange को कॉल किया जाता है? यदि हां, और आप डीबगर में इसके माध्यम से कदम उठाते हैं, तो क्या यह लूप में जाता है? क्या यह आपकी अपेक्षानुसार postJobData प्राप्त करता है? क्या यह (नई) notifyDataSetChanged कॉल तक पहुंचता है? आप हमें बताए बिना कि वास्तव में क्या होता है, इस बात की संभावना नहीं है कि कोई भी इस बिंदु पर अधिक समस्याओं का पता लगाएगा जो मैंने (और एडीएम) पहले ही किया था।
 – 
Frank van Puffelen
24 पद 2020, 17:24
सब कुछ ठीक काम कर रहा है। एकमात्र मुद्दा यह है कि डेटा केवल तभी प्रदर्शित होता है जब बटन दूसरी बार क्लिक किया जाता है
 – 
Nishmitha Naik
24 पद 2020, 17:58
क्या आपने डीबगर में कोड के माध्यम से कदम उठाया था? क्या यह notifyDataSetChanged को (नई) कॉल तक पहुंचा? उसे एडॉप्टर को रिफ्रेश करना चाहिए।
 – 
Frank van Puffelen
24 पद 2020, 18:02
हाँ महोदय, यह 'सूचनाडेटासेट चेंज' के माध्यम से जाता है। लेकिन यह कभी-कभी काम करता है और कभी-कभी यह काम नहीं कर रहा है
 – 
Nishmitha Naik
24 पद 2020, 18:15