0

Стоит следующая задача.

Есть запрос на соединение к БД MYSQL, который выгружает определенные данные в recyclerView. Если данных нет в БД, то progressBar может вечно крутиться, и если нажать на экран, то приложение вылетает.

В коде используется:

public void JSON_WEB_CALL() {
    jsonArrayRequest = new JsonArrayRequest(HTTP_SERVER_URL,

            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {


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

                    Log.d(TAG, "Error: " + error.getMessage());

                    Toast.makeText(MainActivity.this, "Не нажимайте на экран во время загрузки данных", Toast.LENGTH_SHORT).show();

                }
            });

    requestQueue = Volley.newRequestQueue(this);

    requestQueue.add(jsonArrayRequest);
}

Как я понимаю, сюда onErrorResponse(VolleyError error) необходимо вставить некий таймер. Но, мне не ясно, почему вылетает приложение при нажатии на экран.

Вот код из onCreate

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {

    GestureDetector gestureDetector = new GestureDetector(MainActivity.this, new GestureDetector.SimpleOnGestureListener() {

        @Override
        public boolean onSingleTapUp(MotionEvent motionEvent) {

            return true;
        }

    });



    @Override
    public boolean onInterceptTouchEvent(RecyclerView Recyclerview, MotionEvent motionEvent) {
        SubjectNames.get(RecyclerViewClickedItemPOS);
        SubjectNamess.get(RecyclerViewClickedItemPOS);
        SubjectNamesss.get(RecyclerViewClickedItemPOS);
        SubjectNamessss.get(RecyclerViewClickedItemPOS);
        SubjectNamesssss.get(RecyclerViewClickedItemPOS);
        SubjectNamesssssss.get(RecyclerViewClickedItemPOS);
        SubjectNamessssssss.get(RecyclerViewClickedItemPOS);

        ChildView = Recyclerview.findChildViewUnder(motionEvent.getX(), motionEvent.getY());

        if (ChildView != null && gestureDetector.onTouchEvent(motionEvent)) {

            //Getting RecyclerView Clicked item value.
            RecyclerViewClickedItemPOS = Recyclerview.getChildPosition(ChildView);

            Intent Intent = new Intent(getApplicationContext(), FormSendGraf.class);
            Intent.putExtra("KEY_ID",SubjectNames.get(RecyclerViewClickedItemPOS));
             Intent.putExtra("KEY_NUMBER", SubjectNamess.get(RecyclerViewClickedItemPOS));
            Intent.putExtra("KEY_NAMEORG", SubjectNamesss.get(RecyclerViewClickedItemPOS));
            Intent.putExtra("KEY_ADRORG", SubjectNamessss.get(RecyclerViewClickedItemPOS));
            Intent.putExtra("KEY_VID", SubjectNamesssss.get(RecyclerViewClickedItemPOS));
            Intent.putExtra("KEY_vidcode", SubjectNamesssssss.get(RecyclerViewClickedItemPOS));
            Intent.putExtra("KEY_adrcode",  SubjectNamessssssss.get(RecyclerViewClickedItemPOS));
            startActivity(Intent);

            Toast.makeText(MainActivity.this, SubjectNames.get(RecyclerViewClickedItemPOS), Toast.LENGTH_LONG).show();

        }

        return false;
    }


    @Override
    public void onTouchEvent(RecyclerView Recyclerview, MotionEvent motionEvent) {


    }


    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});

Вот лог ошибки:

  06-02 04:56:04.511 5458-5458/com.androidtutorialpoint.androidlogin E/RecyclerView: No adapter attached; skipping layout
06-02 04:56:04.511 5458-5458/com.androidtutorialpoint.androidlogin D/MainActivity: Error: org.json.JSONException: Value No of type java.lang.String cannot be converted to JSONArray
06-02 04:56:06.061 5458-5458/com.androidtutorialpoint.androidlogin D/AndroidRuntime: Shutting down VM
06-02 04:56:06.071 5458-5458/com.androidtutorialpoint.androidlogin W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa4cf7b20)
06-02 04:56:06.071 5458-5458/com.androidtutorialpoint.androidlogin E/AndroidRuntime: FATAL EXCEPTION: main
Weyner
  • 150
  • 1
  • 1
  • 10

1 Answers1

0

Ошибка Error: org.json.JSONException: Value No of type java.lang.String cannot be converted to JSONArray говорит о том, что вы в ответ от сервера ожидаете массив, а вам приходит стринг со значением "No". Из за этого не заполнятся ваш массив для адаптера RecyclerView. И при клике возникает ошибка java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0. Идёт обращение к нулевому элементу пустого массива.

Нужно, чтобы при отсутствии данных сервер возвращал в json пустой массив []. Либо в onErrorResponse обрабатывать ошибку и не показывать лист.

Чтобы progressBar не крутился вечно, вы должны вручную его скрывать в методах onResponse и onErrorResponse:

progressBar.setVisibility(View.INVISIBLE)

А вообще, вы как-то очень странно работаете с RecyclerView. Советую переделать всё по стандартной схеме. Например вот урок по RecyclerView, а вот как добавить клик листенер к нему.

eugeneek
  • 5,057