当我打开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);
答案 0 :(得分:2)
你使用Task.Run()
将加载放到一个单独的线程中,但在那里你编组回UI线程来更新你的适配器(Activity.RunOnUiThread()
),这将阻止UI线程和你的微调器停止运行
根据您的SetTotal()
方法正在执行的操作,您应该只在UI线程上执行mAdapter.NotifyChange(transactions);
的调用。