Only first CardView of RecyclerView is being Colored

妖精的绣舞 提交于 2019-12-24 07:38:39

问题


I have created an app in Android Studio, using CardViews in RecyclerView in connection with Firebase Realtime database, in which user can check his attendance such that if the user came on a holiday(R,G, Saturday or Sunday) that CardView is colored. But in my code only the first CardView is getting colored. I have checked through Log statements that it's traversing through both R and G's if-else statements.

My code is:

public class frag2ofAttendanceNew extends Fragment {

String mPinFromFrag1ofAttendance;
String yearf1;
String monthf1;


private RecyclerView mRecyclerView;
DatabaseReference myRef;
DatabaseReference holidaysRef;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    Log.d("abcd","oncreate view reached");
    final View v= inflater.inflate(R.layout.fragment_frag2of_attendance_new, container, false);
    Log.d("abcd","oncreate view reached and layout inflated");
    mRecyclerView = (RecyclerView)v.findViewById(R.id.recycler_view);
    return v;
}

@Override
public void onStart(){
    super.onStart();
    Log.d("abcd","onstart reached");
    Bundle b = getArguments();
    if(b!=null){
        mPinFromFrag1ofAttendance = b.getString("mPinToFrag2ofAttendance");
        Log.d("abcd","Receiving from frag1ofAttendance");
        yearf1 = b.getString("year");
        monthf1 = b.getString("month");
    }
    Log.d("abcd",mPinFromFrag1ofAttendance);
myRef = FirebaseDatabase.getInstance().getReference().child("Attendance_Records").child(mPinFromFrag1ofAttendance).child(yearf1).child(monthf1);

LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(),LinearLayoutManager.VERTICAL,false);
    mRecyclerView.setLayoutManager(layoutManager);
    //mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    Log.d("abcd","setlayoutmanager");

    FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<Attendance_Records>().setQuery(myRef,Attendance_Records.class).build();
    Log.d("abcd","recycleroptions reached");

    FirebaseRecyclerAdapter<Attendance_Records,AttendanceViewHolder> adapter =
            new FirebaseRecyclerAdapter<Attendance_Records, AttendanceViewHolder>
                    (options) {

            @NonNull
                @Override
                public AttendanceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                    Log.d("abcd","oncreateviewholder reached");
                    view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card,parent,false);
                    Log.d("abcd","cardview inflated");
                    return new AttendanceViewHolder(view);
                }

                @Override
                protected void onBindViewHolder(AttendanceViewHolder holder, int position, Attendance_Records model) {

                    holidaysRef=FirebaseDatabase.getInstance().getReference().child("Holidays");
                    final String userdate = model.getDate();

                    try {
                        Log.d("abcd","StringTodate about to be called");
                        StringToDate(userdate);
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }

                    holidaysRef.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(final DataSnapshot dataSnapshot) {
                            if(dataSnapshot.child(userdate).exists()){
                                Log.d("abcd","date matched");
                       final DatabaseReference tilldateRef = holidaysRef.child(userdate);
                                tilldateRef.addListenerForSingleValueEvent(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot1) {
                                        if(dataSnapshot1.child("G").exists()){
                                            Log.d("abcd","its G");
                                            CardView cv = getView().findViewById(R.id.card_view);
                                            Log.d("abcd","cardview found");
                                            cv.setCardBackgroundColor(Color.CYAN);
                                            Log.d("abcd","changed cv color");
                                        }
                                        else if(dataSnapshot1.child("R").exists()){
                                            Log.d("abcd","its R");
                                            CardView cv = getView().findViewById(R.id.card_view);
                                            Log.d("abcd","cardview found");
                                            cv.setCardBackgroundColor(Color.MAGENTA);
                                            Log.d("abcd","changed cv color");
                                        }
                                        else if(day==7){
                                            Log.d("abcd","its Saturday");
                                            CardView cv = getView().findViewById(R.id.card_view);
                                            Log.d("abcd","cardview found");
                                            cv.setCardBackgroundColor(Color.GRAY);
                                            Log.d("abcd","changed cv color");
                                        }
                                        else if(day==1){
                                            Log.d("abcd","its Sunday");
                                            CardView cv = getView().findViewById(R.id.card_view);
                                            Log.d("abcd","cardview found");
                                            cv.setCardBackgroundColor(Color.DKGRAY);
                                            Log.d("abcd","changed cv color");
                                        }


                                        else{
                                            Log.d("abcd","None from G,R or Weekend");
                                        }
                                    }

                                    @Override
                                    public void onCancelled(DatabaseError databaseError) {

                                    }
                                });
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

                    holder.setYear(model.getYear());
                    holder.setMonth(model.getMonth());
                    holder.setDate(model.getDate());
                    holder.setIntime(model.getInTime());
                    holder.setOuttime(model.getOutTime());
                    holder.setStatus(model.getStatus());
                    holder.setEntrydate(model.getEntryDate());
                    holder.setMyid(model.getMyID());
                    Log.d("abcd","onbindviewholder reached");
                }
    };

    mRecyclerView.setAdapter(adapter);
    adapter.startListening();

}

private void StringToDate(String date) throws ParseException{
    Log.d("abcd","StringtoDate reached");
    DateFormat formatter = null;
    Date convertedDate = null;

    formatter = new SimpleDateFormat("dd-MM-yyyy");
    convertedDate = (Date)formatter.parse(date);
    Log.d("abcd","date converted");

    Calendar c = Calendar.getInstance();
    Log.d("abcd","Calendar getInstance reached");
    c.setTime(convertedDate);
    Log.d("abcd","userdate set in Calendar");
    day = c.get(Calendar.DAY_OF_WEEK);
    Log.d("abcd","day of week is "+day);
}

public class AttendanceViewHolder extends RecyclerView.ViewHolder{
    TextView vhyear, vhmonth, vhdate, vhintime, vhouttime, vhentrydate, vhstatus, vhmyid;
    public AttendanceViewHolder(View itemView){
        super(itemView);
        Log.d("abcd","attendanceviewholder reached");
        vhyear = itemView.findViewById(R.id.year);
        vhmonth = itemView.findViewById(R.id.month);
        vhdate = itemView.findViewById(R.id.date);
        vhintime = itemView.findViewById(R.id.inTime);
        vhouttime = itemView.findViewById(R.id.outTime);
        vhentrydate = itemView.findViewById(R.id.entryDate);
        vhstatus = itemView.findViewById(R.id.status);
        vhmyid = itemView.findViewById(R.id.userId);
        Log.d("abcd","textviews found");

    }

    public void setYear(String year) {
        Log.d("abcd","setyear reached");
        vhyear.setText(year);
        Log.d("abcd",vhyear.getText().toString());
    }

    public void setMonth(String month) {
        Log.d("abcd","setmonth reached");
        vhmonth.setText(month);
    }

    public void setDate(String date) {
        Log.d("abcd","setdate reached");
        vhdate.setText(date);
    }

    public void setIntime(String inTime) {
        Log.d("abcd","setintime reached");
        vhintime.setText(inTime);
    }

    public void setOuttime(String outTime) {
        Log.d("abcd","setouttime reached");
        vhouttime.setText(outTime);
    }

    public void setEntrydate(String entrydate){
        Log.d("abcd","setentrydate reached");
        vhentrydate.setText(entrydate);
    }

    public void setStatus(String status){
        Log.d("abcd","setstatus reached");
        vhstatus.setText(status);
    }

    public void setMyid(String myid){
        Log.d("abcd","setmyid reached");
        vhmyid.setText(myid);
    }
}

}

My Attendance_Records table

My Holidays Table

UPDATE

I have achieved for holidays in holidays table but still not able to color the weekends. Should I put those conditions somewhere else?


回答1:


You should define the CardView in the ViewHolder:

    CardView cv;

        public AttendanceViewHolder(View itemView){
            super(itemView);
                Log.d("abcd","attendanceviewholder reached");
                vhyear = itemView.findViewById(R.id.year);
                cv = itemView.findViewById(R.id.card_view);
    ...
        } 

Then use

holder.cv.setCardBackgroundColor(Color.CYAN);

instead of

CardView cv = getView().findViewById(R.id.card_view);
Log.d("abcd","cardview found");
cv.setCardBackgroundColor(Color.CYAN);


来源:https://stackoverflow.com/questions/49774931/only-first-cardview-of-recyclerview-is-being-colored

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!