Progressbar, пока RecyclerView не будет заполнен - PullRequest
0 голосов
/ 12 июля 2020

Я создал EditText, который используется для поиска.

Как только пользователь нажимает кнопку поиска, я показываю ProgressBar до тех пор, пока RecyclerView не будет загружен, делая это:

et_Search.setOnEditorActionListener( (v, actionId, event) -> {
    if (actionId == EditorInfo.IME_ACTION_SEARCH) {

        InputMethodManager imm =(InputMethodManager) getSystemService( Context.INPUT_METHOD_SERVICE);
        View view = this.getCurrentFocus();
        imm.hideSoftInputFromWindow( view.getWindowToken(), 0);

        pb_Search.setVisibility( View.VISIBLE );

        query = et_Search.getText().toString();

        fetchAddItems(query);

        return true;
    }
    return false;
} );

Где:

private void fetchAddItems(String query) {

    B_client = new ItemClient();
    B_client.getItems( query, new JsonHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
            List<Item> Items;
            try {
                JSONArray items;
                if (response != null) {
                    items = response.getJSONArray( "items" );
                    Items = Item.fromJson( items );

                    AddItemsAdapter = new AddItemAdapter(Items, listenerAdd);
                    rv_Items.setAdapter(AddItemsAdapter);

                    rv_Items.getViewTreeObserver()
                        .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                            @Override
                            public void onGlobalLayout() {
                                pb_Search.setVisibility( View.GONE );
                            }
                        });

                }
            } catch (JSONException ignored) {

            }
        }
    } );

}

Все работает нормально.

Проблема в том случае, когда пользователь выполняет два поиска подряд.

В В этом случае RecyclerView уже заполнен после первого поиска, и поэтому ProgressBar не будет отображаться.

Есть ли способ сделать то, что я хочу в обоих случаях, когда RecyclerView заполнен / обновлено?

Спасибо

РЕШЕНИЕ:

Что решило мою проблему, так это удаление слушателя и использование этого:

rv_Items.getViewTreeObserver()
    .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            rv_Items.setVisibility( View.VISIBLE );
            pb_Search.setVisibility( View.GONE );
            rv_Items.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
    });

1 Ответ

0 голосов
/ 12 июля 2020

Насколько я понимаю, вам необходимо обрабатывать 2 состояния:

  1. ЗАГРУЗКА - когда нажата кнопка поиска и вы получаете данные из Api или Db.
  2. ЗАГРУЖЕН - когда данные извлекаются и устанавливаются в адаптере recyclerview.
   // In loading state,clear data, hide recyclerview and show progressbar
   public void showLoadingState() {
      pb_Search.setVisibility( View.VISIBLE );
      rv_items.setVisbility(View.GONE);
      // Clear your adapter here, otherwise old content will
      // show when you do 2 searches in a row.
   }

   // In loaded state, show recyclerview and hide progressbar
   public void showLoadedState() {
      pb_Search.setVisibility( View.GONE );
      rv_items.setVisbility(View.VISIBLE);
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...