大家好我的应用程序有点奇怪的问题我在使用异步任务填充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是否包含它应该去的东西并膨胀我的布局。奇怪的是,它确实读取了它,但屏幕上没有显示任何布局,它不会抛出任何类型的异常。可能是什么问题?
答案 0 :(得分:1)
您只是给视图充气,但不将视图添加到任何视图组。尝试使用addView(View v)添加视图。
答案 1 :(得分:0)
虽然这只是猜测,因为您没有显示整个代码,但我认为您从未将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
,默认情况下隐藏它并在setVisibility(View.VISIBLE)
和{{View
上调用setVisibility(View.GONE)
当没有连接可用时,在布局的其余部分放置1}}。
编辑:在看到关于该类不属于Activity的编辑后,您的代码不应该编译。要使其正常工作,最好的方法可能是将Activity
句柄保留为其视图。
您需要做的事情:
将AsyncTask
从AsyncTask<String, Void, Void>
更改为
AsyncTask<String, Void, ReturnObject>
其中ReturnObject
是数据
由AsyncTask
制作。将onPostExecute(Void aVoid)
更改为
onPostExecute(ReturnObject returnObject)
也是如此。
在您的ReturnDataHandler
中声明一个接口AsyncTask
handleData(ReturnObject returnObject)
方法,并让您Activity
实现它。将一个实例声明为。的成员变量
AsyncTask
(mDataHandler)并将一个实例作为构造函数
论点。在启动Activity
时通过AsyncTask
。那样,
在onPostExecute
中,你就是这样做的
mDataHandler.handleData(returnObject)
,这是方法
handleData(returnObject)
将根据Views
处理AsyncTask
{{1}} ...
答案 2 :(得分:0)
更改Adapter
的数据(在本例中为CardAdapter
的数据时),您需要调用其notifyDataSetChanged()
方法以允许绑定到此适配器的所有视图更新和重绘自己。来自developer.android.com的文档:
public void notifyDataSetChanged()
通知附加的观察者基础数据已被更改,反映数据集的任何视图都应自行刷新。