【问题标题】:How to control indeterminante ProgressBar which is not part of a ListView?如何控制不属于 ListView 的不确定进度条?
【发布时间】:2014-11-29 05:59:48
【问题描述】:

有,不确定的progressBar 旋转直到ListView 内容准备好显示。 progressBarlistView 都是同一 Fragment 的一部分。

所以我将这个progressBar 编码为可见,并从获取内容的AsyncTask 中消失。

mProgressBar = (ProgressBar) view.findViewById(R.id.progressbar);
mProgressBar.getIndeterminateDrawable()
            .setColorFilter(getResources().getColor(R.color.pink), PorterDuff.Mode.MULTIPLY);

new MyAsyncTask().execute();

//then in asynctask
private class MyAsyncTask extends AsyncTask<Void, Integer, MyAdapter> {
    @Override
    protected void onPreExecute() {
        mProgressBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected MyAdapter doInBackground(Void... params) {
        //do the stuff and return loaded adapter

        return adapter;
    }

    @Override
    protected void onPostExecute(MyAdapter adapter) {
        mProgressBar.setVisibility(View.GONE);
    }
}

但是progressBar 被冻结并且不旋转?!

我尝试从onPreExecute 实例化progressBar,但外部progressBar 不接受我在AsyncTask 中设置的参数。我可以看到,因为它以默认颜色而不是自定义颜色显示。

那么我该如何控制这个progressBar?现在我只需要在内容开始加载时显示它,并在它准备好显示时隐藏它。

注意:我不需要在每个项目中添加progressBar,但我需要按照我描述的方式。

【问题讨论】:

    标签: android android-listview android-asynctask android-progressbar


    【解决方案1】:

    您是否尝试过为 MyAsyncTask 创建一个构造函数并将progressBar 作为参数提供给它?

    您可以像在任何其他 Java 类中一样保存私有属性。

    编辑:我会定义一个自定义处理程序并从 Activity 中调用它,同时使用 progressBar 的可见性。

    public final class LoadingDialogHandler extends Handler {
        private final WeakReference<Activity> mActivity;
        // Constants for Hiding/Showing Loading dialog
        public static final int HIDE_LOADING_DIALOG = 0;
        public static final int SHOW_LOADING_DIALOG = 1;
    
        private View mLoadingDialogContainer;
    
        public LoadingDialogHandler(Activity activity, View container) {
            mActivity = new WeakReference<Activity>(activity);
            mLoadingDialogContainer = container;
        }
    
        public void handleMessage(Message msg) {
            Activity activity = mActivity.get();
            if (activity == null) {
                return;
            }
            if (msg.what == SHOW_LOADING_DIALOG) {
                mLoadingDialogContainer.setVisibility(View.VISIBLE);
    
            } else if (msg.what == HIDE_LOADING_DIALOG) {
                mLoadingDialogContainer.setVisibility(View.GONE);
            }
        }
    

    }

    然后这样称呼它:

    在您的活动/片段中声明句柄并关联进度条:

    LoadingDialogHandler loadingDialogHandler = new LoadingDialogHandler(yourActivity, findViewById(R.id.loading_indicator));
    

    显示/隐藏(显示示例):

    loadingDialogHandler.sendEmptyMessage(LoadingDialogHandler.SHOW);
    

    PS:也许你必须像这样在 UIthread 中运行它:

    activity.runOnUiThread(new Runnable() {
                    public void run() {
                        //update progressBar
                    }
                });
    

    【讨论】:

    • 我做到了。但是ProgressBar 仍然不旋转。好像被冻住了。没有更新进度条。这是不确定的进度条。
    • 我已经编辑了我的答案,希望现在对你有帮助;)
    • 好主意,我将在另一个项目中使用,但 ProgressBAr 仍然冻结。
    • 我不知道你是否已经这样做了,但是尝试删除 mProgressBar.getIndeterminateDrawable() .setColorFilter(getResources().getColor(R.color.pink), PorterDuff.Mode.MULTIPLY) ;如果它仍然不起作用,请删除对 setColorFilter 的调用。如果不是,则仅将 PorterDuff.Mode.MULTIPLY 更改为 Mode.MULTIPLY。这就是我会做的,但我不确定这里发生了什么。
    • 那一行只是改变了进度条的颜色。问题不存在。谢谢
    【解决方案2】:

    就是这么简单,该功能有一个内置 API:

    mProgressBar = (ProgressBar) view.findViewById(R.id.progressbar);
    listView.setEmptyView(mProgressBar);
    

    完成!当列表为空或不为空时,listView 会自动调用带有 GONE 和 VISIBLE 的 setVisibility

    【讨论】:

    • 适配器在加载时不起作用。仅在适配器为空或 null 的情况下。
    • 但是在加载的时候适配器是空的,也可以在加载完成后才将适配器设置到列表中。
    猜你喜欢
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    相关资源
    最近更新 更多