无法在异步任务中扩充布局

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 处理它的视图。

您需要做的事情:

  • 将您的 AsyncTaskAsyncTask<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 的数据时,在本例中为 CardAdapters 数据,您需要调用其 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) 添加视图。