【问题标题】:Content view not yet created, removeHeaderView内容视图尚未创建,removeHeaderView
【发布时间】:2014-10-04 20:51:46
【问题描述】:

当我刷新我的列表视图并同时滑动我的 tabactivity 时,我得到了一个非法状态异常:尚未创建内容视图。我知道列表视图没有完全创建,但在我的代码中我没有找到解决我的问题的方法。在 removeHeader 方法中找到了错误。

public class PFrag extends ListFragment implements OnScrollListener,OnTouchListener{



ArrayList<String> items = new ArrayList<String>();
boolean endProcess = false;
boolean stopLoadMore=false;

IconAdapter myAdapter;
int totalItem=0;
int last=0;
View vfoot;
View vheader;
float currentY;
float previousY;
boolean allowRefresh=false;
boolean refresh=false;
boolean activescroll=true;
boolean move=false;
AddStringTask process;


public PFrag() {
    super();

}



public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    ArrayList<Test> l  = new ArrayList<Test>();
    myAdapter = new IconAdapter(getActivity(), R.layout.row,l);
    initFoot();
    getListView().setOnScrollListener(this);
    getListView().setOnTouchListener(this);
    setListAdapter(myAdapter);
    process=new AddStringTask();
    process.execute(0);

}




public void initFoot(){
    if(getListView().getFooterViewsCount()==0 && vfoot==null){
        vfoot = LayoutInflater.from(getActivity()).inflate(R.layout.footer, null);
        getListView().addFooterView(vfoot, null, false);
        stopLoadMore=false;
        getListView().requestLayout();
        Log.v("initfoot","create");
    }
}





private class AddStringTask extends AsyncTask<Integer, String, ArrayList<Test>>{

    protected void onPreExecute() {  

    }

    @Override
    protected ArrayList<Test> doInBackground(Integer... in) {


        ......Operation
                }

            }else{
                Log.v("status", "stoploadmore");
                stopLoadMore=true;

            }

        } catch (ClientProtocolException e) {

            stopLoadMore=true;

            e.printStackTrace();
        } catch (IOException e) {

            stopLoadMore=true;
            e.printStackTrace();
        }

        return list;
    }


    protected void onProgressUpdate(String... item) {
    }


    protected void onPostExecute(ArrayList<Test> in) {

        cancel(true);
        if(refresh & !activescroll){
            ((IconAdapter)getListAdapter()).setEntries(new ArrayList<Test>()); 
            ((IconAdapter)getListAdapter()).add(in);
        }
        if(!refresh & activescroll)
            ((IconAdapter)getListAdapter()).add(in);
            removeHeader();
            ((IconAdapter)getListAdapter()).setNotifyOnChange(true);

        endProcess=true;

    }
}


public ArrayList<Test> displayTest(String response){ //
    .........
}


public boolean isOnTop(){ 
    ....
} 


private boolean isOnDown() {
    ....
}


@Override
public void onListItemClick(ListView lv, View view, int position,
        long id) {

    Log.v("position",String.valueOf(position));
    Test Test = (Test) getListView().getItemAtPosition(position);
    Toast.makeText(getActivity(), String.valueOf(Test.getNamesociete()), Toast.LENGTH_SHORT).show();
    Intent intent = new Intent(getActivity(),TestDetailActivity.class);
    startActivity(intent);  
}


@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {

}

public void removeFoot(){

    if(getListView().getFooterViewsCount()>0 && vfoot!=null){       
        vfoot.setVisibility( View.INVISIBLE);
        ((IconAdapter)getListAdapter()).setNotifyOnChange(true);
        getListView().requestLayout();

    }

}



/* THE PROBLEM IS THIS METHOD */

public void removeHeader(){

    if(getListView().getHeaderViewsCount()>0){
        Log.v("removeheaderInIF", "ok");        
        getListView().removeHeaderView(vheader);
        Toast.makeText(getActivity(), "delete header", Toast.LENGTH_SHORT).show();
        ((IconAdapter)getListAdapter()).setNotifyOnChange(true);
        getListView().requestLayout();
    }   
}


public void initHeader(){

    try{
        if(getListView().getHeaderViewsCount()==0 ){            
            vheader = LayoutInflater.from(getActivity()).inflate(R.layout.header, null);
            getListView().addHeaderView(vheader, null, false);
            stopLoadMore=false;
            getListView().requestLayout();
            Log.v("initheader","create");           
        }       
    }catch(Exception e){
        Log.v("headererror",String.valueOf(e));
    }   
}



@Override
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {

    last = firstVisibleItem + visibleItemCount; 

    totalItem = totalItemCount;
    if(!stopLoadMore){

        if(last+2 >= totalItemCount && endProcess && isOnDown() ){ 

            endProcess=false;
            activescroll=true;
            vfoot.setVisibility(View.VISIBLE);
            process=new AddStringTask();
            process.execute(totalItemCount-1);

        }
    }else {
        stopLoadMore=true;

        removeFoot();       
    }
}





@Override
public boolean onTouch(View v, MotionEvent event) {

    switch(event.getAction()){
    case MotionEvent.ACTION_DOWN:

        previousY = event.getRawY();
        //Allows refresh if the first visible item is the first in the list
        allowRefresh = isOnTop();
        move=false;
        break;

    case MotionEvent.ACTION_MOVE:

        if(allowRefresh){
            if((previousY - event.getRawY()) <= -50){
                refresh = true;
                move=true;
            }
            else{
                refresh = false;
                move=false;
            }
        }

        break;
    case MotionEvent.ACTION_UP:
        //Refresh
        if(move){ 
            if(refresh & endProcess ){
                Toast.makeText(getActivity(), "Refresh", Toast.LENGTH_SHORT).show();
                activescroll=false;             
                stopAsyncOperation();       
                initHeader();
                ((IconAdapter)getListAdapter()).setNotifyOnChange(true);                                
                new AddStringTask().execute(0);         
            }
        }
        break;
    }
    return false;
}



@Override
public void onPause(){

    stopAsyncOperation();
    super.onPause();
}


 private void stopAsyncOperation(){
        if( process != null){       
            if( process.getStatus().equals( AsyncTask.Status.RUNNING )){
                process.cancel( true );
            }
        }
    }

@Override
public void onDestroy(){
    stopAsyncOperation();
    super.onDestroy();
}

}

这里是错误:

08-11 21:59:51.319:E/AndroidRuntime(1186):致命异常:主要 08-11 21:59:51.319: E/AndroidRuntime(1186): java.lang.IllegalStateException: 内容视图尚未创建 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 android.support.v4.app.ListFragment.ensureList(ListFragment.java:328) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 android.support.v4.app.ListFragment.getListView(ListFragment.java:222) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 com.app.swype.ProximiteFrag.removeHeader(ProximiteFrag.java:396) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 com.app.swype.ProximiteFrag$AddStringTask.onPostExecute(ProximiteFrag.java:269) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 com.app.swype.ProximiteFrag$AddStringTask.onPostExecute(ProximiteFrag.java:1) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 android.os.AsyncTask.finish(AsyncTask.java:602) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 android.os.AsyncTask.access$600(AsyncTask.java:156) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 android.os.Handler.dispatchMessage(Handler.java:99) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 android.os.Looper.loop(Looper.java:137) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 android.app.ActivityThread.main(ActivityThread.java:4424) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 java.lang.reflect.Method.invokeNative(Native Method) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 java.lang.reflect.Method.invoke(Method.java:511) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 08-11 21:59:51.319: E/AndroidRuntime(1186): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 08-11 21:59:51.319: E/AndroidRuntime(1186): at dalvik.system.NativeStart.main(Native Method)

public class MyPagerAdapter extends FragmentStatePagerAdapter  {

public static Fragment prof;
public static Fragment catf;
public static Fragment cof;

public MyPagerAdapter(FragmentManager fm) {
    super(fm);

}


@Override
public Fragment getItem(int arg0) {



    Fragment fragment = null;
    if(arg0==0){

        if(prof==null){
            Log.v("fragment1","kk1");
            prof = new PFrag();
            return prof;
        }



    }else if (arg0==1){
        if(catf==null){
            Log.v("fragment2","kk1");
            catf = new CFrag();
            return catf;
        }

    }else if (arg0==2){

        if(cof==null){
            Log.v("fragment3","kk1");
            cof = new CoFrag();
            return cof;
        }

    }


    return prof;
}

@Override
public int getCount() {

    return 3;
}

}

请你帮帮我。 谢谢。

【问题讨论】:

    标签: android android-fragments android-listview android-asynctask


    【解决方案1】:

    你应该搬家:

    process.execute(0);
    

    到 onStart 或 onResume(这可能会导致它执行多次,但如果需要,您可以为此设置一个标志)。

    【讨论】:

    • 它不起作用。代码将正确执行,除非我刷新我的列表视图并同时滑动我的标签主机。该错误发生在 postexecute 方法中,并涉及 removeheader 方法,特别是 getListview() 行。我不知道我在做什么,也许使用同步方法,因为我多次调用 asynctask 并且我不能只使用一次调用 asynctask。谢谢
    • 我认为问题只是我的tabactivity,因为滑动到第二个片段时没有问题,但只有第三个片段。显然我的第一个片段在那个时候被破坏了。如何补救
    猜你喜欢
    • 2014-04-13
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多