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

时间:2015-01-15 12:56:48

标签: android android-layout android-asynctask

大家好我的应用程序有点奇怪的问题我在使用异步任务填充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是否包含它应该去的东西并膨胀我的布局。奇怪的是,它确实读取了它,但屏幕上没有显示任何布局,它不会抛出任何类型的异常。可能是什么问题?

3 个答案:

答案 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句柄保留为其视图。

您需要做的事情:

  • AsyncTaskAsyncTask<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()

     

通知附加的观察者基础数据已被更改,反映数据集的任何视图都应自行刷新。