Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在URL获取完成时禁用进度条:标准场景_Android_Android Fragments_Retrofit - Fatal编程技术网

Android 在URL获取完成时禁用进度条:标准场景

Android 在URL获取完成时禁用进度条:标准场景,android,android-fragments,retrofit,Android,Android Fragments,Retrofit,我有一个相当流行的场景,其中有一个包含进度条和ListView的片段。我想在使用改造获取数据后填充ListView。现在,一旦响应返回,进度条就需要不可见 当获取成功时,最好将onCreateView()中膨胀的片段布局视图作为成员变量存储,并使用该变量禁用onResponse()(回调在onCreate()中创建)中的进度条 片段布局: <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="htt

我有一个相当流行的场景,其中有一个包含进度条和ListView的片段。我想在使用改造获取数据后填充ListView。现在,一旦响应返回,进度条就需要不可见

当获取成功时,最好将
onCreateView()
中膨胀的片段布局视图作为成员变量存储,并使用该变量禁用
onResponse()
(回调在
onCreate()
中创建)中的进度条

片段布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/source_items_list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:padding="5dp">


    <com.gc.materialdesign.views.ProgressBarCircularIndeterminate
            android:id="@+id/progress_bar"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:background="#1E88E5"
            android:layout_gravity="center_horizontal"/>

    <ListView android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:id="@+id/source_list"/>

</FrameLayout>

谢谢

最好在onCreateView()中初始化进度条,而不是使用view.findViewById(),因为这是一个昂贵的操作

我建议不要保留视图,而是将进度条作为成员变量,在fragment的ViewCreated上初始化它,然后用进度条变量做任何你想做的事情。我明白了。但是为什么呢?保留对视图的引用是否会占用更多内存?但它不是应该很轻吗?实际上在内存方面:是的,现在它几乎是一样的,但是假设您的xml中有一些新组件,那么它是内存密集型的,一旦触发onDestroyView of fragment,就会调用gc,当应用程序处于后台时,操作系统可能会因为内存不足而杀死你的应用程序。findViewById操作一点也不昂贵。它是一个由R.java和android生成的id,它维护一个哈希,其中有1对1的映射,因此理想情况下它的O(1)操作。@dex我认为它遍历视图层次结构,直到找到匹配的id。这就是为什么每次需要对视图进行引用时不建议这样做的原因。最好有一个局部变量,并在需要时使用它。你是说android store以树的形式存储视图可能是balance one,并且使用bfs或dfs进行遍历?如果可能的话,请分享相关链接。非常感谢您的澄清。但是从这里查看findViewById代码并没有给人留下这样的印象,即它具有某种树形式的视图,并且他们没有使用bfs或dfs来查找值。@dex它当然是一个树遍历。在您的链接中,“视图ID不必在整个树中都是唯一的,但最好确保它们至少在您正在搜索的树的部分中是唯一的。”
findViewById
调用是
findViewTraversal
。您缺少的是
View
s是树中的叶子,只要看一下,它就显示为O(1),但是
ViewGroup
s(布局的父类)显示它递归地调用其所有子级的
findViewById
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mItemList = new ArrayList<SourceItem>();

    RestClient.get().getSources().enqueue(new Callback<SourceItemList>() {
        @Override
        public void onResponse(Response<SourceItemList> response, Retrofit retrofit) {

            if (response.isSuccess()) {

                disableProgressBar();

                //...
            }
        }

        @Override
        public void onFailure(Throwable t) {
            disableProgressBar();
            return;
        }

        private void disableProgressBar() {
            if (mView != null) {
                mView.findViewById(R.id.progress_bar).setVisibility(View.INVISIBLE);
            }
        }
    });

    // ...
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
    mView = inflater.inflate(R.layout.fragment_sourceitem_list, viewGroup, false);
    // ...

    return mView;
}