ProgressBar在异步加载期间不旋转

时间:2017-01-26 22:55:24

标签: android xamarin

当我打开Fragment时,我尝试显示ProgressBar,填充RecyclerView,将NotifyChange更新为RecyclerView,然后隐藏{{1} }}

现在ProgressBar并没有旋转。我认为它与在UI线程上执行的SetRecyclerViewItems有关,但是如果我不这样做,我会收到一条错误,说UI只能在UI线程中更新。

片段:

ProgressBar

Adapter.NotifyChange

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            /* Initializing elements code removed */

            SetRecyclerView();

            return view;
        }

    public async override void OnStart()
            {
                base.OnStart();

                ShowProgressBar();
                await LoadAsync();
                HideProgressBar();
            }

            private async Task LoadAsync()
            {
                await Task.Run(() => {
                    SetRecyclerViewItems();
                });

            }

            private void SetRecyclerView()
            {
                mLayoutManager = new LinearLayoutManager(mRecyclerView.Context);
                mRecyclerView.SetLayoutManager(mLayoutManager);
                mAdapter = new TransactionsRecyclerAdapter(this.Activity, mTransactions, dateFormat);
                mAdapter.ItemClick += MAdapter_ItemClick;
                mRecyclerView.SetAdapter(mAdapter);
            }

            private void SetRecyclerViewItems(List<PaymentListItemViewModel> transactions = null)
            {
                Activity.RunOnUiThread(() => {

                    if (transactions == null)
                        transactions = GetTransactions();
                    mAdapter.NotifyChange(transactions);
                    SetTotal();
                });
            }

为什么ProgressBar没有旋转? 我将新数据填充到适配器的方式是否正确(发送新列表然后public void NotifyChange(List<PaymentListItemViewModel> transactions) { mTransactions = transactions; NotifyDataSetChanged(); }

布局:

NotifyDataSetChanged

在OnCreateView中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/login_background">
    <RelativeLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:gravity="center"
        android:layout_centerInParent="true"
        android:id="@+id/transactionsProgressBar">
        <ProgressBar
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            style="@android:style/Widget.ProgressBar.Large" />
    </RelativeLayout>
    <LinearLayout
        android:orientation="vertical"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/linearLayout4"
        android:layout_weight="1">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerViewTransactions"
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:scrollbars="vertical" />
    </LinearLayout>

</LinearLayout>

显示/隐藏ProgressBar:

mLayoutProgressBar = view.FindViewById<RelativeLayout>(Resource.Id.transactionsProgressBar);

1 个答案:

答案 0 :(得分:2)

你使用Task.Run()将加载放到一个单独的线程中,但在那里你编组回UI线程来更新你的适配器(Activity.RunOnUiThread()),这将阻止UI线程和你的微调器停止运行

根据您的SetTotal()方法正在执行的操作,您应该只在UI线程上执行mAdapter.NotifyChange(transactions);的调用。