当我刷新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;
}
}
请帮助我。
感谢。
答案 0 :(得分:0)
你应该搬家:
process.execute(0);
到onStart或onResume(这可能导致它执行多次,但如果需要,你可以为它设置一个标志)。