2016-05-02 4 views
0

私はRelativeLayoutを持っています。私はListViewProgressBarを持っています。 ListViewは他の要素の下にあり、ProgressBarは画面の中央に表示されます。ListView上でProgressBarフロントを持ちます

ここではAsyncTaskを使用し、ListViewにデータを読み込み、これを実行している間にProgressBarを表示します。

リストが空の場合、ProgressBarが表示されます。しかし、リストにいくつかの要素があり、リスト内のデータを読み込んでリフレッシュしようとすると、ProgressBarは表示されません。これはおそらく、ListViewがアダプタを設定すると(ProgressBarの上に)表示されているためです。

私はprogressbar.bringtofront()を使ってみましたが、運はありませんでした。

ここは私のレイアウトです。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
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> 

私は私のAsyncTask.get()を使用しているので、私はAsyncTaskでそれを伝統的な方法を更新するのではなく、Activity自体にProgressBarを更新します。ここでは、私は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); 

私はAsyncTaskを使用しながらProgressBarListViewの上部に表示されるようにしたいです。

ありがとうございます!

答えて

0

DynamicListViewProgressBarFrameLayoutにラッピングしてみてください。 FrameLayoutの子ビューがスタックに描画されるので、最後に追加された子(ProgressBar)が上に表示されます。

0

私はそれを理解しました。問題はAsynctaskです。 .get()を使用すると、同期し、メインスレッドがタスクを返すのを待ちます。これにより、ProgressBarが印刷されなくなりました。私は非同期タスク(Asynctask =>非同期、Duh。)を作り、それは魔法のように機能しました!

0

ProgressBarの代わりに、ProgressDialogを使用できます。 AsynctaskのpublishProgress()とonProgressUpdate()を使用して、ProgressDialogにデータを公開するだけです。これははるかに簡単になります。

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"); 
    } 
} 
+0

いいね。ありがとう!しかし私は私のケースでは 'ProgressBar'を使う必要があります。 –

関連する問題