Невозможно скрыть ProgressBar программно в Android

#android #android-progressbar

#Android #android-progressbar

Вопрос:

Я пытаюсь скрыть a ProgressBar после загрузки данных в a ListView . Однако, ProgressBar похоже, это не связано с изменением представления. Я activityIndicator не получаю ошибок (похоже, их нет NULL ). Что-то не так с тем, как я собираюсь это сделать?

 <ProgressBar
    android:id="@ id/activityIndicator"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:indeterminateOnly="true"
    android:keepScreenOn="true"
    android:layout_gravity="center" />
  

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    theInflater = inflater;
    theContainer = container;

    currentView = inflater.inflate(R.layout.fragment_server_list, container, false);
    activityIndicator = (ProgressBar) currentView.findViewById(R.id.activityIndicator);

    // check if you are connected or not
    if(isConnected()){
        new Thread(new Runnable() {
            public void run() {
                HashMap<String, String> data = new HashMap<String, String>();
                data.put("action", "getServerList");
                data.put("phone_id", "857a95839d7d6c270e97ff6a3a64008ccf96074ebffa6e8e82db932a6c635644");
                data.put("username", "atomic");
                data.put("password", "Pa55word1");
                AsyncHttpPost asyncHttpPost = new AsyncHttpPost(data);

                try {
                    String jsonString = asyncHttpPost.execute("http://website.com/app-files/API.php").get();

                    Log.i("JSON Result", jsonString);

                    try {
                        JSONObject json = new JSONObject(jsonString);

                        if (json.optString("result").equalsIgnoreCase("true")) {
                            JSONArray articles = json.getJSONArray("data");

                            for (int i = 0; i < articles.length(); i  ) {
                                JSONObject row = articles.getJSONObject(i);
                                myServers.add(new Server(Integer.parseInt(row.getString("id")), 
                                        row.getString("host"), 
                                        0, //Integer.parseInt(row.getString("port")), 
                                        "", //row.getString("hostname"), 
                                        "", //row.getString("ipAddress"), 
                                        "", //row.getString("checkDate"), 
                                        "", //row.getString("serverInfo"), 
                                        "", //row.getString("lastModified"), 
                                        "", //row.getString("contentType"), 
                                        "", //row.getString("city"), 
                                        "", //row.getString("state"), 
                                        "", //row.getString("zip"), 
                                        "", //row.getString("country"), 
                                        "", //row.getString("latitude"), 
                                        "", //row.getString("longitude"), 
                                        "", //row.getString("timeZone"), 
                                        0, //Integer.parseInt(row.getString("consecutiveFails")), 
                                        Float.parseFloat(row.getString("latency")), 
                                        Float.parseFloat(row.getString("latency")) > 300 ? 
                                                R.drawable.btn_yellow : (Float.parseFloat(row.getString("latency")) > 1 ? 
                                                        R.drawable.btn_green : R.drawable.btn_red)));

                                //Log.i("Current Server's Host", row.getString("host"));
                            }

                            populateListView();

                            registerClickCallback();

                            currentView.post(new Runnable() {
                                public void run() {
                                    activityIndicator.setVisibility(View.INVISIBLE);
                                }
                            });
                        }
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }).start();

        activityIndicator.setVisibility(View.GONE);
    }else{
        Log.i("Connection", "You are NOT connected");
    }

    return currentView;
}
  

Редактировать: кажется, что если я покину вкладку и вернусь на вкладку для этого представления, индикатор выполнения исчезнет. Таким образом, это похоже на удаление индикатора выполнения, но представление не обновляется, чтобы показать, что оно было просмотрено.

Комментарии:

1. ваше приложение закрывается или нет?

2. Вы скрываете ProgressBar сразу после запуска потока, а также внутри потока. Вы уверены в этом поведении?

3. @Rod_Algonquin Нет, приложение не вылетает. Он отлично отображает мой список, и я могу прокручивать и щелкать. Единственное, что он не делает, это скрывает индикатор выполнения.

4. @AbhishekShukla Да, я уверен. Я просто пытаюсь скрыть его. После этого я могу заставить его скрываться только после того, как это необходимо. Но, к сожалению, он вообще не скрывается.

5. Плохая идея поместить индикатор выполнения в xml. Лучше создайте его на лету.

Ответ №1:

Ну, я думаю, что это довольно смешно, но вот как я это исправил.

В моем xml для ProgressBar , я добавил android:visibility="gone" , чтобы скрыть его по умолчанию. Затем, в моем коде, я сначала сказал ему display ( View.VISIBLE ), прежде чем он попытался получить список серверов, затем я сказал ему hide ( View.GONE ) после того, как это было сделано. Это сработало (я мог видеть индикатор выполнения во время загрузки данных, затем он исчез). Так что, я полагаю, я не мог заставить его скрываться в коде, потому что код — это не то, что заставило его быть видимым с самого начала… Мне это кажется ошибкой.

Комментарии:

1. Вау, ты только что спас меня после того, как я потратил на это 2 часа. Просто глупо. Спасибо!