onclick работает после прокрутки - PullRequest
0 голосов
/ 18 июня 2020

Я создал очень простую аутентификацию для щелчка по адаптеру. например, когда пользователь нажимает на элемент, «телефон» будет отправлен в базу данных, и при подтверждении Toast покажет «Да». в противном случае Toast покажет «Нет!».

Но когда приложение запускается в первый раз при нажатии на элемент (если метод отвечает «ok») Toast No !. Но после некоторого прокрутки страницы и повторного нажатия на элемент Toast показывает Да. На самом деле сначала, когда приложение запускается, ответ не показывает никакого значения, но после прокрутки страницы он покажет значение.

Я полностью запутался. Спасибо за помощь.

часть моего адаптера

@Override
public void onBindViewHolder(@NonNull viewHolder viewHolder, int i) {
Model modelPost = this.modelPost.get(i);

viewHolder.cardView.setOnClickListener(v -> {

            check();

            if (access == null) {

                Toast.makeText(context, "No!", Toast.LENGTH_SHORT).show();
            } else {

                Toast.makeText(context, "Yes", Toast.LENGTH_SHORT).show();
            }
        });

Мой метод внизу страницы

private void check() {

        String url = "https://example.com/index.php";
        Response.Listener<String> listener = response -> {
            if (response.trim().equals("ok")) {
                access = "1";
            }
        };
        Response.ErrorListener errorListener = error -> Toast.makeText(context, "error", Toast.LENGTH_SHORT).show();
        StringRequest request = new StringRequest(Request.Method.POST, url, listener, errorListener) {
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> map = new Hashtable<>();
                map.put("User", phone);
                return map;
            }
        };
        MySingleton.getInstance(context).addToRequestQueue(request);

    }

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Первый раз, когда вы нажимаете на всплывающее окно с элементом, отображается «нет», потому что значение переменной доступа в этот раз равно нулю, почему оно равно нулю, потому что прослушиватель ответа проверки метода выполняет работу в фоновом режиме, и этот всплывающий код выполняется до того, как ответ пришел позже, когда вы снова щелкните по нему, напечатайте да, потому что в это время значение переменной доступа не равно нулю. Чтобы код работал правильно, вы должны настроить его, вы можете проверить значение переменной доступа внутри слушателя и проверить журнал.

if (access == null) {
 Toast.makeText(context, "No!", Toast.LENGTH_SHORT).show();
} else {
   Toast.makeText(context, "Yes", Toast.LENGTH_SHORT).show();
  }
0 голосов
/ 18 июня 2020

Это потому, что изначально access имеет значение null, когда вы вызываете check() после того, как ответ возвращает ok. access устанавливается в «1». Поэтому, когда вы еще раз щелкнете по карточке, она будет отображать «Да» вместо «Нет». 1008 *

private void check() {

        String url = "https://example.com/index.php";
        Response.Listener<String> listener = response -> {
             if (response.trim().equals("ok")) {
                Toast.makeText(context, "No!", Toast.LENGTH_SHORT).show();
             } else {
               Toast.makeText(context, "Yes", Toast.LENGTH_SHORT).show();
             }
        };
        Response.ErrorListener errorListener = error -> Toast.makeText(context, "error", Toast.LENGTH_SHORT).show();
        StringRequest request = new StringRequest(Request.Method.POST, url, listener, errorListener) {
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> map = new Hashtable<>();
                map.put("User", phone);
                return map;
            }
        };
        MySingleton.getInstance(context).addToRequestQueue(request);

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...