Индикатор выполнения не отображается, пока не отобразится RecyclerView

#java #android #android-recyclerview #progress-bar

#java #Android #android-recyclerview #индикатор выполнения

Вопрос:

Я разрабатываю приложение event и patrimony для Android. У меня проблема. Когда я нажимаю на категорию, появляется список элементов. Но пока данные извлекаются из базы данных, индикатор выполнения не отображается.

Может кто-нибудь мне помочь?

Мой код:

Item_Layout_Activity.java

     public class Item_Layout_Activity extends Fragment {

    RecyclerView recyclerView;
    String hash,email,tipo_login="";
    ArrayList<Hotel> array_hotel;
    ArrayList<Patrimony> array,array_temp;
    double latitudeUser,longitudeUser;
    String tipo_categoria;
    ProgressBar progressBar_app;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_list_others, container, false);
        recyclerView = (RecyclerView) root.findViewById(R.id.rv);

        progressBar_app=root.findViewById(R.id.progressBar_app);

        progressBar_app.setVisibility(View.VISIBLE);
        recyclerView.setVisibility(View.GONE);

        LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
        RecyclerView.LayoutManager rvLiLayoutManager = layoutManager;
        recyclerView.setLayoutManager(rvLiLayoutManager);

        tipo_categoria= DrawerActivity.categoria_tab_outros;

        array=new ArrayList<>();
        array_temp=new ArrayList<>();

        if (tipo_categoria != null) {
           
            switch (tipo_categoria) {

                case "Hotel":

                    // will show the list of hotels
                    if(Controller.array_items_hotels!=null ) {

                            if (array_hotel != null)
                                array_hotel.clear();

                        if(array_hotel==null)
                            array_hotel=new ArrayList<>();

                            for (Hotel h: Controller.array_items_hotels) {
                                        if (h.getLocalidade().equals(Controller.localidade)) {
                                            array_hotel.add(h);
                                        }
                                    }
                            }

                            recyclerView.setVisibility(View.VISIBLE);
                            Adapter_Item adapter_item = new Adapter_Item(getContext(), array_hotel, "hotel");
                            recyclerView.setAdapter(adapter_item);

                    }// if the array does not yet exist then fetch the hotels a database
                    else
                    {

                        boolean res=Controller.VerificarConetividade();
                        if(res)
                        {
                            // search list of hotels at BD
                            buscarHoteisBD();
                        } else
                            Toast.makeText(getContext(), R.string.alerta_conexao_rede,Toast.LENGTH_LONG).show();

                    }

                    break;
        }
    }


// get list of hotels from the database
    private  void buscarHoteisBD(){

        Retrofit.Builder builder = new Retrofit.Builder().baseUrl(WebAPI.BASE_URL).addConverterFactory(GsonConverterFactory.create());
        Retrofit retrofit = builder.build();
        WebAPI webApi = retrofit.create(WebAPI.class);
        
        Call<ArrayList<Hotel>> call = webApi.get_Hotels(email_encrypt,tipo_login,hash,linguagem);

        call.enqueue(new Callback<ArrayList<Hotel>>() {
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onResponse(Call<ArrayList<Hotel>> call, Response<ArrayList<Hotel>> response) {

                array_hotel = response.body();

                if (array_hotel == null) {
                    Toast.makeText(getContext(), R.string.alerta_falha_BD, Toast.LENGTH_SHORT).show();
                } else {
                    Controller.array_items_hotels.addAll(array_hotel);
                    array_hotel.clear();
                    for (Hotel p:Controller.array_items_hotels) {

                                    array_hotel.add(p);
                            }
                    }
         }
                recyclerView.setVisibility(View.VISIBLE);
                Adapter_Item adapter_item = new Adapter_Item(getContext() ,array_hotel,"hotel");
                recyclerView.setAdapter(adapter_item);
            }

            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onFailure(Call<ArrayList<Hotel>> call, Throwable t) {
                Toast.makeText(getContext(), R.string.alerta_falha_BD, Toast.LENGTH_SHORT).show();
            }
        });
    }
}
 

fragment_list_others.xml

  <?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@ id/constraintLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/fotolayout">

     <androidx.recyclerview.widget.RecyclerView
         android:id="@ id/rv"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />

    <ProgressBar
        android:id="@ id/progressBar_app"
        style="?android:attr/progressBarStyle"
        android:layout_width="50sp"
        android:layout_height="50sp"
        android:layout_gravity="center"
        android:indeterminateDrawable="@drawable/circularprogress"
        android:visibility="gone" />
</FrameLayout>
 

[![элементы списка] [1]][1]
[1]: https://i.stack.imgur.com/DRJEU.jpg

Ответ №1:

Метод onCreateView должен возвращать представление, которое должно содержать все элементы и индикатор выполнения, который вы пытаетесь сделать видимым. Но поскольку вы добавляете все элементы синхронно, в основном потоке (UI) метод вернет представление (вместе с индикатором выполнения) только при добавлении всех элементов.

Я бы постарался сделать следующее:

  • удалите строку «progressBar_app.setVisibility(Просмотр.ВИДИМЫЙ);»
  • добавьте строку «progressBar_app.setVisibility (View.GONE);» перед возвратом представления из метода onCreateView
  • сделайте индикатор выполнения видимым по умолчанию (android: visibility =»visible») — он станет скрытым, когда будут добавлены все элементы.