首页 > 解决方案 > Android Recycler 视图不能返回超过 8 个项目

问题描述

我现在遇到这个问题有一段时间了,当我使用 volley 从数据库中检索数据然后在回收器视图中显示它时,如果项目是 8 或小于 8,那么它会毫无问题地显示它们,但是如果我检索更多数据库中的项目超过 8 个,则活动关闭/崩溃并返回主要活动。我在 android studio 的运行控制台中没有收到任何错误。我正在从数据库中为单个项目、2 个字符串和一个图像检索 3 个东西。我认为错误不在用于获取数据的 php 文件中,因为我已经检查过并且它可以毫无问题地检索。我搜索了回收器视图的 android 文档,但找不到任何东西

注意:我将图像作为字符串获取,然后转换为位图。

如果还有其他需要,那么我可以毫无问题地提供它们。代码如下:

用于调用有问题的回收器视图活动的方法。

    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);
    }

}

回收者视图活动适配器
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);
    }
}

标签: javaandroidandroid-recyclerview

解决方案


如果图像尺寸很大,您可能会在转换时遇到异常OutOfMemorybytes arraybitmap

添加转换位图try catchdecodeStringToImage方法,并在加载超过 8 个图像时检查日志。


推荐阅读