无法在异步任务中扩充布局
Unable to inflate layout in Async Task
大家好我的应用程序有一个奇怪的问题,我正在使用异步任务在 RecyclerView 中填充列表。一切正常,但当没有数据可填充时,我想膨胀另一个布局以显示错误消息。
public class generateAds extends AsyncTask<String, Void, Void> {
protected Void doInBackground(String... params)
{
//Filling the list -This part is OK
}
//Here is my problem
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
spinner.setVisibility(View.GONE);
if(ads.size() > 0)
{
if (isFirstSearch)
{
isFirstSearch = false;
cardAdapter = new CardAdapter(context, ads);
recyclerViewZone.setAdapter(cardAdapter);
recyclerViewZone.setItemAnimator(new DefaultItemAnimator());
}
else
{
for (int i = 0; i < ads.size(); i++) {
cardAdapter.add(ads.get(i), cardAdapter.getItemCount());
}
}
generatedAdsFromScroll = false;
}
else
{
//This doesn't inflate
try
{
rootView = inflater.inflate(R.layout.error_internet_connection,container,false);
}catch (Exception e)
{
e.printStackTrace(); //No exception thrown for some reason
}
}
}
}
所以在我的 onPostExecute 之后,我检查列表 ADS 是否包含它应该去膨胀我的布局的东西。奇怪的是它确实读取了它,但是屏幕上没有显示任何布局,它也没有抛出任何类型的异常。可能是什么问题?
虽然这只是一个猜测,因为您没有显示整个代码,但我认为您从未将 rootView
设置为 Activity
.
的内容
而不是这个
try {
rootView = inflater.inflate(R.layout.error_internet_connection,container,false);
}catch (Exception e) {
e.printStackTrace(); //No exception thrown for some reason
}
这样做
setContentView(R.layout.error_internet_connection);
或者,您可以声明要在主布局内没有连接时显示的 View
,默认情况下将其隐藏,然后在 View
上调用 setVisibility(View.VISIBLE)
和setVisibility(View.GONE)
在没有可用连接时布局的其余部分。
EDIT :在看到您对 class 不属于 Activity 的编辑后,您的代码不应编译。要使其正常工作,最好的方法可能是让 Activity
处理它的视图。
您需要做的事情:
将您的 AsyncTask
从 AsyncTask<String, Void, Void>
更改为
AsyncTask<String, Void, ReturnObject>
其中 ReturnObject
是数据
由 AsyncTask
制作。将 onPostExecute(Void aVoid)
更改为
onPostExecute(ReturnObject returnObject)
还有。
在你的 AsyncTask
中声明一个接口 ReturnDataHandler
,有一个
handleData(ReturnObject returnObject)
方法,还有你的 Activity
实施它。声明一个实例作为成员变量
AsyncTask
(mDataHandler) 取一个实例作为构造函数
争论。在启动 AsyncTask
时传递你的 Activity
。那样,
在 onPostExecute
,你只需要做
mDataHandler.handleData(returnObject)
,就是这个方法
handleData(returnObject)
将根据
AsyncTask
...
的结果
当更改 Adapter
的数据时,在本例中为 CardAdapter
s 数据,您需要调用其 notifyDataSetChanged()
方法以允许绑定到此适配器的所有视图更新并重绘自身。来自 developer.android.com 的文档:
public void notifyDataSetChanged()
Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.
您只是在膨胀视图,而不是将视图添加到任何视图组。尝试 addView(View v) 添加视图。
大家好我的应用程序有一个奇怪的问题,我正在使用异步任务在 RecyclerView 中填充列表。一切正常,但当没有数据可填充时,我想膨胀另一个布局以显示错误消息。
public class generateAds extends AsyncTask<String, Void, Void> {
protected Void doInBackground(String... params)
{
//Filling the list -This part is OK
}
//Here is my problem
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
spinner.setVisibility(View.GONE);
if(ads.size() > 0)
{
if (isFirstSearch)
{
isFirstSearch = false;
cardAdapter = new CardAdapter(context, ads);
recyclerViewZone.setAdapter(cardAdapter);
recyclerViewZone.setItemAnimator(new DefaultItemAnimator());
}
else
{
for (int i = 0; i < ads.size(); i++) {
cardAdapter.add(ads.get(i), cardAdapter.getItemCount());
}
}
generatedAdsFromScroll = false;
}
else
{
//This doesn't inflate
try
{
rootView = inflater.inflate(R.layout.error_internet_connection,container,false);
}catch (Exception e)
{
e.printStackTrace(); //No exception thrown for some reason
}
}
}
}
所以在我的 onPostExecute 之后,我检查列表 ADS 是否包含它应该去膨胀我的布局的东西。奇怪的是它确实读取了它,但是屏幕上没有显示任何布局,它也没有抛出任何类型的异常。可能是什么问题?
虽然这只是一个猜测,因为您没有显示整个代码,但我认为您从未将 rootView
设置为 Activity
.
而不是这个
try {
rootView = inflater.inflate(R.layout.error_internet_connection,container,false);
}catch (Exception e) {
e.printStackTrace(); //No exception thrown for some reason
}
这样做
setContentView(R.layout.error_internet_connection);
或者,您可以声明要在主布局内没有连接时显示的 View
,默认情况下将其隐藏,然后在 View
上调用 setVisibility(View.VISIBLE)
和setVisibility(View.GONE)
在没有可用连接时布局的其余部分。
EDIT :在看到您对 class 不属于 Activity 的编辑后,您的代码不应编译。要使其正常工作,最好的方法可能是让 Activity
处理它的视图。
您需要做的事情:
将您的
AsyncTask
从AsyncTask<String, Void, Void>
更改为AsyncTask<String, Void, ReturnObject>
其中ReturnObject
是数据 由AsyncTask
制作。将onPostExecute(Void aVoid)
更改为onPostExecute(ReturnObject returnObject)
还有。在你的
AsyncTask
中声明一个接口ReturnDataHandler
,有一个handleData(ReturnObject returnObject)
方法,还有你的Activity
实施它。声明一个实例作为成员变量AsyncTask
(mDataHandler) 取一个实例作为构造函数 争论。在启动AsyncTask
时传递你的Activity
。那样, 在onPostExecute
,你只需要做mDataHandler.handleData(returnObject)
,就是这个方法handleData(returnObject)
将根据AsyncTask
... 的结果
当更改 Adapter
的数据时,在本例中为 CardAdapter
s 数据,您需要调用其 notifyDataSetChanged()
方法以允许绑定到此适配器的所有视图更新并重绘自身。来自 developer.android.com 的文档:
public void notifyDataSetChanged()
Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.
您只是在膨胀视图,而不是将视图添加到任何视图组。尝试 addView(View v) 添加视图。