Принесите ProgressBar фронт, над ListView

I have a RelativeLayoutwhich i have a ListViewand a ProgressBar. ListViewЭто ниже куча других элементов и по ProgressBarцентру экрана.

Теперь я использую AsyncTaskи загружаю данные В ListViewи я хочу показать во ProgressBarвремя этого.

Когда список пуст,ProgressBarотображается. Но когда список уже содержит некоторые элементы и когда я пытаюсь загрузить и обновить данные в списке, ProgressBarэто не отображается. Это, возможно, потомуListView, что становится на вершину (вышеProgressBar), когда я устанавливаю адаптер.

Я пытался использоватьprogressbar.bringtofront(), но не повезло.

Вот мой макет.

<RelativeLayout 

android_layout_width="match_parent"
android_layout_height="match_parent"
android_orientation="vertical"
android_paddingBottom="@dimen/activity_vertical_margin"
android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin">

...

<com.nhaarman.listviewanimations.itemmanipulation.DynamicListView
    android_id="@+id/favourites_list"
    android_layout_width="match_parent"
    android_layout_height="wrap_content"
    android_layout_below="@+id/refresh_button"
    android_divider="@null"
    android_paddingTop="10dp" />

<ProgressBar
    android_id="@+id/refresh_progress"
    style="?android:attr/progressBarStyle"
    android_layout_width="wrap_content"
    android_layout_height="wrap_content"
    android_layout_centerInParent="true"
    android_visibility="invisible" />

</RelativeLayout>

Так как я использую a .get()в моем AsyncTask, Я обновляю ProgressBarв Activityсебе вместо обновления традиционным способом AsyncTask. Вот код, который я использую, чтобы показать и скрыть ProgressBar.

//before i send the asynctask
refreshProgress.setVisibility(View.VISIBLE);
refreshProgress.bringToFront();
ArrayList<String> response = task.execute(new String[]{url}).get();

...

//after parsing the response and setting the adapter for the listview
favoritesAdapter.notifyDataSetChanged();
favoritesAdapter = new FavoritesAdapter(this, main_company, main_symbol, main_price, main_change, main_marketcap);
favoritesListView.setAdapter(favoritesAdapter);
refreshProgress.bringToFront();
refreshProgress.setVisibility(View.INVISIBLE);

Я хочуProgressBar, чтобы быть показано поверх ListViewпри использовании AsyncTask.

Спасибо!

3 ответа

  1. Попробуйте обернуть DynamicListViewи ProgressBarв FrameLayoutКот . Поскольку дочерние представления a FrameLayoutотображаются в стеке, последний добавленный дочерний (Ваш ProgressBar) будет отображаться сверху.

  2. Я понял это. Проблема в том Asynctask. При использовании .get()он становится синхронным и ожидает возвращения задачи в главном потоке. Это ProgressBarпомешало напечатать. Я сделал асинхронную задачу ( Asynctask=> асинхронная. Да.) и это сработало как по волшебству!

  3. Или intead ProgressBar вы можете использовать ProgressDialog. Вам просто нужно опубликовать данные в ProgressDialog через publishProgress () и onProgressUpdate () в Asynctask. Это будет намного проще.

    class async extends AsyncTask<String,Integer,String>{
    
        ProgressDialog pd;
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
    
            pd=new ProgressDialog(MainActivity.this);
            pd.setTitle("Title");
            pd.setCancelable(false);
            pd.show();
        }
    
        @Override
        protected String doInBackground(String... params) {
            //Your stuff
    
            publishProgress(progress);//To update the ProgressDialog(Not neccessary)
    
            return null;
        }
    
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            pd.dismiss();
        }
    
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
    
            pd.setMessage(values[0]+"% Completed");
        }
    }