如何在加载数据时实现progressBar?

时间:2013-09-17 15:35:03

标签: android background android-asynctask android-progressbar

我想在下图中实现progressBar。

现在,我有AsyncTask来自片段类,我使用AsyncTask来加载数据,现在我已经实现了progressBar对话框,但我想摆脱它,因为我想要做一个更好的用户体验

我在onPreExecute()方法中显示了ProgressBar对话框,然后将它解除为onPostExecute。

那么,我如何实现后面的进度条,如下图所示

enter image description here

4 个答案:

答案 0 :(得分:7)

哥们,

如果您真的只想要一张像您发布的图片的进度条,只需将进度条 indeterminate 属性设置为true即可:)

您可以使用代码或直接在xml上执行操作。

在代码中:

yourProgressBar.setIndeterminate(true);

在XML中,只需将属性indeterminate设置为true即可。

这是一个简单的布局作为例子:

<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

<ProgressBar
    android:id="@+id/progressBar1"
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:indeterminate="true" />

</RelativeLayout>

答案 1 :(得分:2)

如果您只想显示进度,请查看此代码。这可能会给你一个想法: 公共类MainActivity扩展Activity实现OnClickListener {

myTask mytask = new myTask();
Button button1;
ProgressBar progressbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button1 = (Button) findViewById(R.id.button1);
    progressbar = (ProgressBar) findViewById(R.id.progressBar);
    button1.setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onClick(View view) {
    mytask.execute();
}

class myTask extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        progressbar.setProgress(0);
        progressbar.setMax(100);
        int progressbarstatus = 0;
    };

    @Override
    protected String doInBackground(String... params) {
        for (int i = 0; i < 20; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            progressbar.incrementProgressBy(10);
        }
        return "completed";
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

    }

    @Override
    protected void onProgressUpdate(String... values) {

        super.onProgressUpdate(values);
    }
}

}

但是如果你想像对话一样显示,请看一下这段代码:

公共类YoutubeVideoMain扩展了Activity {

ListView videolist;

ArrayList<String> videoArrayList = new ArrayList<String>();

ArrayAdapter<String> videoadapter;
Context context;
String feedURL = "https://gdata.youtube.com/feeds/api/users/twistedequations/uploads?v=2&alt=jsonc&start-index=1&max-results=5";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    context = this;
    setContentView(R.layout.youtubelist);
    videolist = (ListView) findViewById(R.id.videolist);

    videoadapter = new ArrayAdapter<String>(this, R.layout.video_list_item,
            videoArrayList);

    videolist.setAdapter(videoadapter);
    VideoListTask loadertask = new VideoListTask();
    loadertask.execute();

}

private class VideoListTask extends AsyncTask<Void, String, Void> {

    ProgressDialog dialogue;

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        dialogue.dismiss();

        videoadapter.notifyDataSetChanged();
    }

    @Override
    protected void onPreExecute() {
        dialogue = new ProgressDialog(context);
        dialogue.setTitle("Loading items..");
        dialogue.show();
        super.onPreExecute();

    }

    @Override
    protected Void doInBackground(Void... params) {

        HttpClient client = new DefaultHttpClient();
        HttpGet getRequest = new HttpGet(feedURL);
        try {
            HttpResponse response = client.execute(getRequest);
            StatusLine statusline = response.getStatusLine();
            int statuscode = statusline.getStatusCode();

            if (statuscode != 200) {

                return null;
            }

            InputStream jsonStream = response.getEntity().getContent();

            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(jsonStream));

            StringBuilder builder = new StringBuilder();
            String line;

            while ((line = reader.readLine()) != null) {

                builder.append(line);

            }
            String jsonData = builder.toString();



            JSONObject json = new JSONObject(jsonData);


            JSONObject data = json.getJSONObject("data");

            JSONArray items = data.getJSONArray("items");

            for (int i = 0; i < items.length(); i++) {


                JSONObject video = items.getJSONObject(i);



                videoArrayList.add(video.getString("title"));



            }

            Log.i("YouJsonData:", jsonData);

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }


        return null;
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

也许这可以帮到你。

答案 2 :(得分:0)

使用publishProgress()

使用相同的asynctask

答案 3 :(得分:0)

class YourCLassName extends AsyncTask<String, Integer, Void> {

    private ProgressDialog pd = new ProgressDialog(Files.this);

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        pd.setTitle("your message");

        pd.show();

    }

    @Override
    protected Void doInBackground(String... params) {
            // YOUR PIECE OF CODE

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);


            pd.setMessage("Task Completed  .. whatever");


    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
    }


}