gpt4 book ai didi

android - ProgressBar 在异步加载期间不旋转

转载 作者:行者123 更新时间:2023-11-29 19:23:28 25 4
gpt4 key购买 nike

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

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

fragment :

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();
});
}

适配器.NotifyChange

public void NotifyChange(List<PaymentListItemViewModel> transactions)
{
mTransactions = transactions;
NotifyDataSetChanged();
}

为什么 ProgressBar 不旋转?我向适配器填充新数据的方式是否正确(发送新列表然后 NotifyDataSetChanged

布局:

<?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>

在 OnCreateView 中:

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

显示/隐藏进度条:

private void ShowProgressBar()
{
mLayoutProgressBar.Visibility = ViewStates.Visible;
}

private void HideProgressBar()
{
mLayoutProgressBar.Visibility = ViewStates.Gone;
}

最佳答案

您通过使用 Task.Run() 将加载放到一个单独的线程上,但在其中您编码回 UI 线程以更新您的适配器 (Activity.RunOnUiThread()), 这将阻塞 UI 线程并且你的微调器停止运行。

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

关于android - ProgressBar 在异步加载期间不旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41884448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com