从另一个类和notifyDataSetChanced调用内部类NullPointerException

问题描述:

我有一个主要活动,它有选项卡主机。我将tabhost类充气到我的主要活动中。从另一个类和notifyDataSetChanced调用内部类NullPointerException

我的问题是,其中一个标签有一个gridview。当我点击该选项卡时,其课程获得NullPointerException

我的主要活动的卷轴到达底部,我称为提供asyc任务数据的内部类,但notifyDataSetChanged给出了例外。

这里是logcat。

04-07 14:36:51.520: E/AndroidRuntime(8503): FATAL EXCEPTION: main 
04-07 14:36:51.520: E/AndroidRuntime(8503): java.lang.NullPointerException 
04-07 14:36:51.520: E/AndroidRuntime(8503):  at com.example.profile.Tab2$GetDataTask.onPostExecute(Tab2.java:176) 
04-07 14:36:51.520: E/AndroidRuntime(8503):  at com.example.profile.Tab2$GetDataTask.onPostExecute(Tab2.java:1) 
04-07 14:36:51.520: E/AndroidRuntime(8503):  at android.os.AsyncTask.finish(AsyncTask.java:631) 
04-07 14:36:51.520: E/AndroidRuntime(8503):  at android.os.AsyncTask.access$600(AsyncTask.java:177) 
04-07 14:36:51.520: E/AndroidRuntime(8503):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
04-07 14:36:51.520: E/AndroidRuntime(8503):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-07 14:36:51.520: E/AndroidRuntime(8503):  at android.os.Looper.loop(Looper.java:176) 
04-07 14:36:51.520: E/AndroidRuntime(8503):  at android.app.ActivityThread.main(ActivityThread.java:5419) 
04-07 14:36:51.520: E/AndroidRuntime(8503):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-07 14:36:51.520: E/AndroidRuntime(8503):  at java.lang.reflect.Method.invoke(Method.java:525) 
04-07 14:36:51.520: E/AndroidRuntime(8503):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
04-07 14:36:51.520: E/AndroidRuntime(8503):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
04-07 14:36:51.520: E/AndroidRuntime(8503):  at dalvik.system.NativeStart.main(Native Method) 

这是我调用类主要活动代码:

Tab2 newObj = new Tab2(); newObj.LoadMore(); //

这里是我的标签类代码:

public class GetDataTask extends AsyncTask<Void, Void, List<String>> { 
    @Override 
    protected List<String> doInBackground(Void... params) { 
     // Simulates a background job. 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
     } 
     return products_x220; 
    } 

    @Override 
    protected void onPostExecute(List<String> result) { 
     products_x220.addAll(GetDataService.List_x220); 

     Products_imgAdapter.notifyDataSetChanged(); // this line gives error. 
     super.onPostExecute(result); 
    } 
} 

TAB2类的整个代码:

公共类Tab2扩展片段{

List<String> products_x220 = new ArrayList<String>(); 
ImageAdapter Products_imgAdapter; 
DisplayImageOptions options; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    options = new DisplayImageOptions.Builder() 
    .showImageOnLoading(R.drawable.ic_stub) 
    .showImageForEmptyUri(R.drawable.ic_empty) 
    .showImageOnFail(R.drawable.ic_error) 
    .cacheInMemory(false) 
    .cacheOnDisk(true) 
    .considerExifParams(true) 
    .bitmapConfig(Bitmap.Config.ARGB_8888) 
    .build(); 

    new GetDataService(); 
    new GetDataTask().execute(); 
    products_x220.addAll(GetDataService.List_x220); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.collectionproducts_layout, container, false); 


    ExpandableHeightGridView mGridViewProducts = (ExpandableHeightGridView)v.findViewById(R.id.gridview_products); 
    mGridViewProducts.setExpanded(true); 

    Products_imgAdapter = new ImageAdapter(); 
    mGridViewProducts.setAdapter(Products_imgAdapter); 

    loadMoreBtn = (Button)v.findViewById(R.id.loadMoreBtn); 

    loadMoreBtn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      GetDataService.List_x220.clear(); 
      new GetDataService(); 
      new GetDataTask().execute(); 
     } 
    }); 

    return v; 
} 

@Override 
public void setUserVisibleHint(boolean visible) 
{ 
    super.setUserVisibleHint(visible); 
    if (visible && isResumed()) 
    { 
     onResume(); 
    } 
} 
@Override 
public void onResume() 
{ 
    super.onResume(); 
    if (!getUserVisibleHint()) 
    { 
     isVisible = false; 
     return; 
    } 
    Tab1.isVisible = false; 
    isVisible = true; 

} 

public void LoadMore(){ 
    new GetDataService(); 
    new GetDataTask().execute(); 
} 

public class GetDataTask extends AsyncTask<Void, Void, List<String>> { 
    @Override 
    protected List<String> doInBackground(Void... params) { 
     // Simulates a background job. 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
     } 
     return products_x220; 
    } 

    @Override 
    protected void onPostExecute(List<String> result) { 
     products_x220.addAll(GetDataService.List_x220); 

     Products_imgAdapter.notifyDataSetChanged(); 
     super.onPostExecute(result); 
    } 
} 
public class ImageAdapter extends BaseAdapter { 

    private LayoutInflater inflater; 
    ImageLoader imageLoader = ImageLoader.getInstance(); 
    ImageAdapter() { 
     inflater = LayoutInflater.from(getActivity()); 
    } 

    @Override 
    public int getCount() { 
     return products_x220.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder2 holder2; 
     View view = convertView; 
     if (view == null) { 
      view = inflater.inflate(R.layout.item_grid_products, parent, false); 
      holder2 = new ViewHolder2(); 
      assert view != null; 
      holder2.imageView = (ImageView) view.findViewById(R.id.image); 
      holder2.progressBar = (ProgressBar) view.findViewById(R.id.progress); 
      view.setTag(holder2); 
     } else { 
      holder2 = (ViewHolder2) view.getTag(); 
     } 

     ImageLoader.getInstance() 
       .displayImage(products_x220.get(position), holder2.imageView, options, new SimpleImageLoadingListener() { 
        @Override 
        public void onLoadingStarted(String imageUri, View view) { 
         holder2.progressBar.setProgress(0); 
         holder2.progressBar.setVisibility(View.VISIBLE); 
        } 

        @Override 
        public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
         holder2.progressBar.setVisibility(View.GONE); 
        } 

        @Override 
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
         holder2.progressBar.setVisibility(View.GONE); 
        } 
       }, new ImageLoadingProgressListener() { 
        @Override 
        public void onProgressUpdate(String imageUri, View view, int current, int total) { 
         holder2.progressBar.setProgress(Math.round(100.0f * current/total)); 
        } 
       }); 

     return view; 
    } 

} 
static class ViewHolder2 { 
    ImageView imageView; 
    ProgressBar progressBar; 
} 

}

请为什么我收到NullPointerException异常。 谢谢大家。

+0

帖子中LoadMore()方法来实现 – Pankaj

+0

检查编辑之类的代码,将其请。我加了班。 – newComer

+0

为什么你要调用LoadMore()方法。不要直接调用它。在setAdapter()方法后,从onCreateView()方法调用它。 – Pankaj

适配器没有在调用GetDataTask异步任务的时间存在,正因为如此,在PostExecute,适配器并不存在 - 让你的标签是没有得到适配器的对象....

+0

你能详细解释一下吗? – newComer

+1

你叫 new GetDataTask()。execute();在onCreate,而你初始化适配器在oncreateView .... onCreate方法之前调用onCreateView方法...在这一点上适配器为空.. –

你应该在setAdapter之后调用asyncTask。刚刚从OnCreate中删除

new GetDataTask().execute(); 

mGridViewProducts.setAdapter(Products_imgAdapter);