尚未创建的内容视图,removeHeaderView

时间:2014-08-11 22:10:07

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

当我刷新listview并在同一时间滑动tabactivity时,我获得了一个非常状态异常:尚未创建的内容视图。我知道listview还没有完全创建,但在我的代码中我没有找到解决我的问题的方法。在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):at com.app.swype.ProximiteFrag.removeHeader(ProximiteFrag.java:396)   08-11 21:59:51.319:E / AndroidRuntime(1186):at com.app.swype.ProximiteFrag $ AddStringTask.onPostExecute(ProximiteFrag.java:269)   08-11 21:59:51.319:E / AndroidRuntime(1186):at 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):at java.lang.reflect.Method.invokeNative(Native Method)   08-11 21:59:51.319:E / AndroidRuntime(1186):at java.lang.reflect.Method.invoke(Method.java:511)   08-11 21:59:51.319:E / AndroidRuntime(1186):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)   08-11 21:59:51.319:E / AndroidRuntime(1186):at 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;
}

}
请帮助我。 感谢。

1 个答案:

答案 0 :(得分:0)

你应该搬家:

process.execute(0);

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