Android Recycler view cannot return more than 8 items

Viewed 44

I am having this issue for some time now, when I retrieved data from a database using volley and then show it in a recycler view, if the items are 8 or less than 8 then it shows them without any problem, but if I retrieve more than 8 items from database then the activity closes/crashes and goes back to the main activity. I don't get any error in the run console in android studio. I am retrieving 3 things from database for a single item, 2 strings and an image. I don't think the error is in the php file which is used to get the data as that I have checked and it retrieves without any issue. I have searched android documentation of recycler view but couldn't find anything

NOTE: I am getting image as string and then converting to bitmap.

if there is anything else needed then I can provide them without any issue. the code is below:

Method which is used to call the recycler view activity which has problems.

    public void onViewAttendanceButtonClick(int position, String courseCode, 
     String courseName, String batchName) {

        if (MainActivity.teacherData != null) {
            
     seeAttendanceDetails(MainActivity.teacherData.getEmail(),courseCode, 
     batchName, courseName, getDateAndTime);

        }

    }

    private void seeAttendanceDetails(final String email,final String 
    courseCode, final String batchName,final String courseName, final String 
    date) {
        StringRequest stringRequest = new StringRequest(Request.Method.POST, 
    seeAttendanceDetails, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONArray jsonArray = new JSONArray(response);
                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject data = jsonArray.getJSONObject(i);

                        String fullName = data.getString("full_name");
                        String Email = data.getString("email");
                        String photo = data.getString("photo");

                        Toast.makeText(CoursesActivity.this, courseCode,
                                Toast.LENGTH_LONG).show();

                        Attendance attendance1 = new Attendance(fullName, Email, photo);
                        attendanceArrayList.add(attendance1);
                    }
                    if (!attendanceArrayList.isEmpty()) {
                        Intent intent = new Intent(CoursesActivity.this, 
     ShowAttendanceActivity.class);
                        Bundle bundle = new Bundle();
                        bundle.putString("attendanceCourseCode", 
    courseCode);
                        bundle.putString("attendanceCourseName", 
    courseName);
                        bundle.putString("attendanceBatchName", batchName);
                        bundle.putSerializable("attendanceList", 
    attendanceArrayList);

                        intent.putExtras(bundle);
                        startActivity(intent);
                    }

                    else if (RegistrationActivity.teacherData != null) {
                      //  
     seeAttendanceDetails(RegistrationActivity.teacherData.getEmail(), 
     batchName,courseName, getDateAndTime);
                       // Toast.makeText(CoursesActivity.this,"No Record 
     Found",Toast.LENGTH_LONG).show();
                    }
                } catch (Exception e) {

                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(CoursesActivity.this, 
     error.getMessage().toString(), Toast.LENGTH_SHORT).show();
            }
        }) {
            public Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("email", email);
                params.put("batch", batchName);
                params.put("date", date);
                params.put("courseCode",courseCode);
                return params;
            }
        };
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }
    }
<br/>
The recycler view activity code 


    public class ShowAttendanceActivity extends AppCompatActivity implements 
    ShowAttendanceActivityAdapter.RemoveAttendanceClickListener {

    private RecyclerView recyclerView;
    private String courseCode,courseName,batchName;
    private ArrayList<Attendance> attendanceArrayList = new ArrayList<>();

    private TextView 
    textViewCourseCode,textViewCourseName,textViewBatchName;

    private String deleteStudentAttendance = 
  
"https://asuiot.umargulzar.com/Teacher%20API%2
0Files/deleteStudentattendance.php";
    int success;
    private String TAG_SUCCESS = "success";
    private String TAG_MESSAGE = "message";

    private String getDateAndTime;

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

        recyclerView = findViewById(R.id.attendance_details_recyclerView);

        textViewCourseCode = findViewById(R.id.SA_textView_course_code);
        textViewCourseName = findViewById(R.id.SA_textView_course_name);
        textViewBatchName = findViewById(R.id.SA_textView_Batch);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL,false);
        recyclerView.setLayoutManager(layoutManager);

        Calendar calendar = Calendar.getInstance();
        //  SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MMM-yyy hh:mm:ss a");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd");
        String dateTime = simpleDateFormat.format(calendar.getTime());
        this.getDateAndTime = dateTime;

        courseCode = (String) getIntent().getStringExtra("attendanceCourseCode");
        courseName = (String) getIntent().getStringExtra("attendanceCourseName");
        batchName = (String) getIntent().getStringExtra("attendanceBatchName");
        attendanceArrayList = (ArrayList<Attendance>) getIntent().getExtras().getSerializable("attendanceList");

        textViewCourseCode.setText(courseCode);
        textViewCourseName.setText(courseName);
        textViewBatchName.setText(batchName);
        recyclerView.setAdapter(new ShowAttendanceActivityAdapter(attendanceArrayList,this));

    }

    @Override
    public void onRemoveAttendanceClick(int position,String email) {
       // Toast.makeText(ShowAttendanceActivity.this,"The Email of Student:"+email,Toast.LENGTH_LONG).show();
        if(MainActivity.teacherData !=null){
            deleteStudentAttendance(email,getDateAndTime,courseCode);
        }
    }

    private void deleteStudentAttendance(final String email, final String getDateAndTime,final String courseCode) {
        StringRequest stringRequest = new StringRequest(Request.Method.POST, deleteStudentAttendance, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    success = jsonObject.getInt(TAG_SUCCESS);
                    if (success == 1) {
                        Toast.makeText(ShowAttendanceActivity.this, jsonObject.getString(TAG_MESSAGE)+" Plz refresh the page.", Toast.LENGTH_SHORT).show();

                    } else {

                        Toast.makeText(ShowAttendanceActivity.this, jsonObject.getString(TAG_MESSAGE), Toast.LENGTH_SHORT).show();
                    }
                } catch (Exception e) {

                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        }){
            public Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("Email", email);
                params.put("Date",getDateAndTime);
                params.put("CourseCode",courseCode);
                return params;
            }
        };
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }

}

the recycler view activity adapter
public class ShowAttendanceActivityAdapter extends RecyclerView.Adapter<ShowAttendanceActivityAdapter.AttendanceView> {

    private ArrayList<Attendance> attendanceData;
    Bitmap bitmap;
    private RemoveAttendanceClickListener removeAttendanceClickListener;


    public ShowAttendanceActivityAdapter(ArrayList<Attendance> attendanceData,RemoveAttendanceClickListener removeAttendanceClickListener){
        this.attendanceData = attendanceData;
        this.removeAttendanceClickListener = removeAttendanceClickListener;
    }

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

    @Override
    public void onBindViewHolder(@NonNull AttendanceView holder, int position) {
        Attendance attendance = attendanceData.get(position);
        holder.textViewName.setText(attendance.getStudentName());
      //  holder.textViewEmail.setText(attendance.getStudentEmail());
        holder.textViewEmail.setText(attendance.getStudentEmail());
        decodeStringToImage(attendance.getStudentPhoto());
        holder.imageViewPhoto.setImageBitmap(bitmap);
    }

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


    public void decodeStringToImage(String photo) {
        //  Bitmap bitmap = photo.
        byte[] bytes = Base64.decode(photo, Base64.DEFAULT);

        bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

    }

    public class AttendanceView extends RecyclerView.ViewHolder implements View.OnClickListener{

        TextView textViewName, textViewEmail;
        ImageView imageViewPhoto;
        Button buttonRemoveCourse;
        RemoveAttendanceClickListener removeAttendanceClickListener;

        public AttendanceView(@NonNull View itemView,RemoveAttendanceClickListener removeAttendanceClickListener) {
            super(itemView);
            textViewName = itemView.findViewById(R.id.textView_name);
            textViewEmail = itemView.findViewById(R.id.textView_Email);
            imageViewPhoto = itemView.findViewById(R.id.textView_SA_Photo);

            this.removeAttendanceClickListener = removeAttendanceClickListener;

            buttonRemoveCourse = itemView.findViewById(R.id.btn_remove_attendance);
            buttonRemoveCourse.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_remove_attendance:
                    removeAttendanceClickListener.onRemoveAttendanceClick(getAdapterPosition(),textViewEmail.getText().toString());
                    break;
            }
        }
    }
    public interface RemoveAttendanceClickListener{
        void onRemoveAttendanceClick(int position,String email);
    }
}

1 Answers

You are probably getting OutOfMemory exception while converting bytes array in to bitmap if the image sizes are huge.

Add try catch in your decodeStringToImage method where you are converting bitmaps and check the log when you load more than 8 images.

Related