为什么我的 android progressBar 永远不会出现?
Why my android progressBar never shows up?
我有一个 recyclerView,它正在加载并完美显示我想要的项目,但是有延迟(当应用程序从网络上获取 xml 新闻并解析它们时),我想显示一个进度条以指示用户。进度条在那里,但它永远不会出现。
这是我的代码:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, SearchView.OnQueryTextListener {
private ArrayList<NewsItem> newsItems;
private ProgressBar updateProgressBar;
private RecyclerView newsItemsRecyclerView;
private NewsAdapter newsAdapter;
private SearchView searchView;
private NewsAddressProvider newsAddressProvider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hookUpScreenViews();
//making the list ready
newsItems = new ArrayList<>();
//getting the news
newsAddressProvider = new NewsAddressProvider();
getTheNews(newsAddressProvider.getGeneral());
//setting up the search view
searchView.setOnQueryTextListener(this);
}
private void getTheNews(ArrayList<String> addresses) {
for (String address : addresses) {
StringRequest stringRequest = new StringRequest(address, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
NewsXMLParser newsXMLParser = new NewsXMLParser(response);
newsXMLParser.parseNewsXml();
newsItems.addAll(newsXMLParser.getNewsItems());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
Volley.newRequestQueue(this).add(stringRequest);
}
updateRecyclerView(newsItems);
}
private void hookUpScreenViews() {
//setting the progressBar
updateProgressBar = findViewById(R.id.updateProgressBar);
newsItemsRecyclerView = findViewById(R.id.newsItemsRecyclerView);
searchView = findViewById(R.id.main_news_search_view);
}
private void updateRecyclerView(ArrayList<NewsItem> newsList) {
if (newsList != null) {
updateProgressBar.setVisibility(View.INVISIBLE);
}
newsAdapter = new NewsAdapter(newsList, this);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
newsItemsRecyclerView.setLayoutManager(layoutManager);
newsItemsRecyclerView.setAdapter(newsAdapter);
newsAdapter.notifyDataSetChanged();
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newsAdapter != null) {
newsAdapter.getFilter().filter(newText);
}
return true;
}
}
我也试过了
if (newsList != null) {
updateProgressBar.setVisibility(View.GONE);
}
还有这段代码:
if (newsList != null && newsList.size()>0) {
updateProgressBar.setVisibility(View.INVISIBLE);
}
我也在第二种方法中使用了 .GONE
,但是这次 ProgreesBar 永远不会消失,它只是停留在那里并一直旋转,当我尝试 Log.d 时,它说newsList 是空的!,虽然其中显然有值,并且 recyclerView 正在显示它们。
而不是 .size()
我也检查了 .isEmpty()
,但结果还是一样!
这是进度条的 xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".activities.MainActivity">
<android.support.v7.widget.RecyclerView
android:background="@color/transparent"
android:padding="5dp"
android:id="@+id/newsItemsRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/mobileBanner"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:divider="@color/transparent"/>
<ProgressBar
android:id="@+id/updateProgressBar"
style="?android:attr/progressBarStyle"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:layout_gravity="top|center_horizontal"/>
</RelativeLayout>
您的 updateRecyclerView
方法在 MainThead 中调用并立即执行。
将您的 updateRecyclerView
方法放在 onResponse
和 onErrorResponse
中
问题是您基本上是从 onCreate()
间接调用 updateProgressBar.setVisibility(View.INVISIBLE);
Volley
请求是异步的,因此 onResponse()
在查询完成后调用。
基本上你的代码是这样运行的:首先从 onCreate()
你调用 getTheNews()
它几乎是瞬间运行通过 for
循环(Volley 是异步的)。然后 updateRecyclerView()
然后 updateProgressBar.setVisibility(View.INVISIBLE);
因为这真的很快你就看不到 ProggessBar
编辑:
为计数器添加一个class变量:
private int addressCounter = 0;
现在像这样更改 getTheNews()
方法:
private void getTheNews(ArrayList<String> addresses) {
for (String address : addresses) {
StringRequest stringRequest = new StringRequest(address, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
NewsXMLParser newsXMLParser = new NewsXMLParser(response);
newsXMLParser.parseNewsXml();
newsItems.addAll(newsXMLParser.getNewsItems());
newsAdapter.notifyDataSetChanged();
if(addessCounter >= address.size()){
updateProgressBar.setVisibility(View.INVISIBLE);
}
//Increment the counter
addressCounter++;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if(addessCounter >= address.size()){
updateProgressBar.setVisibility(View.INVISIBLE);
}
//increment the counter here, too!
addressCounter++;
}
});
Volley.newRequestQueue(this).add(stringRequest);
}
}
您可能还想考虑:
如果您打算使用 hookUpScreenViews()
来初始化您的视图,为什么不继续添加 searchView.setOnQueryTextListener(this);
呢?您还可以添加设置 RecyclerView
的代码,因为它只需要调用一次。
private void hookUpScreenViews() {
//setting the progressBar
updateProgressBar = findViewById(R.id.updateProgressBar);
newsItemsRecyclerView = findViewById(R.id.newsItemsRecyclerView);
searchView = findViewById(R.id.main_news_search_view);
searchView.setOnQueryTextListener(this);
newsAdapter = new NewsAdapter(newsList, this);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
newsItemsRecyclerView.setLayoutManager(layoutManager);
newsItemsRecyclerView.setAdapter(newsAdapter);
}
免责声明:我没有尝试过此代码,因此您可能需要稍微调整一下。
编辑:
这是工作代码:
public void onResponse(String response) {
addressCounter++;
NewsXMLParser newsXMLParser = new NewsXMLParser(response);
newsXMLParser.parseNewsXml();
newsItems.addAll(newsXMLParser.getNewsItems());
if (addressCounter>=addresses.size()){
updateRecyclerView(newsItems);
}
}
我有一个 recyclerView,它正在加载并完美显示我想要的项目,但是有延迟(当应用程序从网络上获取 xml 新闻并解析它们时),我想显示一个进度条以指示用户。进度条在那里,但它永远不会出现。
这是我的代码:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, SearchView.OnQueryTextListener {
private ArrayList<NewsItem> newsItems;
private ProgressBar updateProgressBar;
private RecyclerView newsItemsRecyclerView;
private NewsAdapter newsAdapter;
private SearchView searchView;
private NewsAddressProvider newsAddressProvider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hookUpScreenViews();
//making the list ready
newsItems = new ArrayList<>();
//getting the news
newsAddressProvider = new NewsAddressProvider();
getTheNews(newsAddressProvider.getGeneral());
//setting up the search view
searchView.setOnQueryTextListener(this);
}
private void getTheNews(ArrayList<String> addresses) {
for (String address : addresses) {
StringRequest stringRequest = new StringRequest(address, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
NewsXMLParser newsXMLParser = new NewsXMLParser(response);
newsXMLParser.parseNewsXml();
newsItems.addAll(newsXMLParser.getNewsItems());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
Volley.newRequestQueue(this).add(stringRequest);
}
updateRecyclerView(newsItems);
}
private void hookUpScreenViews() {
//setting the progressBar
updateProgressBar = findViewById(R.id.updateProgressBar);
newsItemsRecyclerView = findViewById(R.id.newsItemsRecyclerView);
searchView = findViewById(R.id.main_news_search_view);
}
private void updateRecyclerView(ArrayList<NewsItem> newsList) {
if (newsList != null) {
updateProgressBar.setVisibility(View.INVISIBLE);
}
newsAdapter = new NewsAdapter(newsList, this);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
newsItemsRecyclerView.setLayoutManager(layoutManager);
newsItemsRecyclerView.setAdapter(newsAdapter);
newsAdapter.notifyDataSetChanged();
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newsAdapter != null) {
newsAdapter.getFilter().filter(newText);
}
return true;
}
}
我也试过了
if (newsList != null) {
updateProgressBar.setVisibility(View.GONE);
}
还有这段代码:
if (newsList != null && newsList.size()>0) {
updateProgressBar.setVisibility(View.INVISIBLE);
}
我也在第二种方法中使用了 .GONE
,但是这次 ProgreesBar 永远不会消失,它只是停留在那里并一直旋转,当我尝试 Log.d 时,它说newsList 是空的!,虽然其中显然有值,并且 recyclerView 正在显示它们。
而不是 .size()
我也检查了 .isEmpty()
,但结果还是一样!
这是进度条的 xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".activities.MainActivity">
<android.support.v7.widget.RecyclerView
android:background="@color/transparent"
android:padding="5dp"
android:id="@+id/newsItemsRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/mobileBanner"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:divider="@color/transparent"/>
<ProgressBar
android:id="@+id/updateProgressBar"
style="?android:attr/progressBarStyle"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:layout_gravity="top|center_horizontal"/>
</RelativeLayout>
您的 updateRecyclerView
方法在 MainThead 中调用并立即执行。
将您的 updateRecyclerView
方法放在 onResponse
和 onErrorResponse
问题是您基本上是从 onCreate()
updateProgressBar.setVisibility(View.INVISIBLE);
Volley
请求是异步的,因此 onResponse()
在查询完成后调用。
基本上你的代码是这样运行的:首先从 onCreate()
你调用 getTheNews()
它几乎是瞬间运行通过 for
循环(Volley 是异步的)。然后 updateRecyclerView()
然后 updateProgressBar.setVisibility(View.INVISIBLE);
因为这真的很快你就看不到 ProggessBar
编辑:
为计数器添加一个class变量:
private int addressCounter = 0;
现在像这样更改 getTheNews()
方法:
private void getTheNews(ArrayList<String> addresses) {
for (String address : addresses) {
StringRequest stringRequest = new StringRequest(address, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
NewsXMLParser newsXMLParser = new NewsXMLParser(response);
newsXMLParser.parseNewsXml();
newsItems.addAll(newsXMLParser.getNewsItems());
newsAdapter.notifyDataSetChanged();
if(addessCounter >= address.size()){
updateProgressBar.setVisibility(View.INVISIBLE);
}
//Increment the counter
addressCounter++;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if(addessCounter >= address.size()){
updateProgressBar.setVisibility(View.INVISIBLE);
}
//increment the counter here, too!
addressCounter++;
}
});
Volley.newRequestQueue(this).add(stringRequest);
}
}
您可能还想考虑:
如果您打算使用 hookUpScreenViews()
来初始化您的视图,为什么不继续添加 searchView.setOnQueryTextListener(this);
呢?您还可以添加设置 RecyclerView
的代码,因为它只需要调用一次。
private void hookUpScreenViews() {
//setting the progressBar
updateProgressBar = findViewById(R.id.updateProgressBar);
newsItemsRecyclerView = findViewById(R.id.newsItemsRecyclerView);
searchView = findViewById(R.id.main_news_search_view);
searchView.setOnQueryTextListener(this);
newsAdapter = new NewsAdapter(newsList, this);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
newsItemsRecyclerView.setLayoutManager(layoutManager);
newsItemsRecyclerView.setAdapter(newsAdapter);
}
免责声明:我没有尝试过此代码,因此您可能需要稍微调整一下。
编辑: 这是工作代码:
public void onResponse(String response) {
addressCounter++;
NewsXMLParser newsXMLParser = new NewsXMLParser(response);
newsXMLParser.parseNewsXml();
newsItems.addAll(newsXMLParser.getNewsItems());
if (addressCounter>=addresses.size()){
updateRecyclerView(newsItems);
}
}