2015-01-01 70 views
0

我有问题在arraylist中追加新数据。当调用LoadData对象Iteamcher有新的数据但我不知道追加它。所以当我设置数据listview发生NullPointerException。更新arraylist中的新数据

我需要帮助。请编辑我的代码。

非常感谢!

public class InfoTeacherFragment extends Fragment { 

    private String URL = "http://scv.udn.vn/dhdn/trdhsp/page/"; 
    ProgressDialog pDialog; 
    Context mContext; 
    private ArrayList<ItemTeacher> data; 
// ItemTeacher itemTeacher; 
    // ArrayList<String> Name; 
    // ArrayList<String> School; 
    // ArrayList<String> Link; 
    // ArrayList<String> Icon; 
    ListView lvItem; 
    DisplayImageOptions options; 
    ImageLoader imageloader; 
    View mFooterView; 
    InfoTeacher adapter; 
    ProgressBar loading; 
    int CurrentPage = 1; 
    int visibleThreshold = 3; 
    int startPage = 1; 
    boolean loadingMore = false; 

    public InfoTeacherFragment() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     options = new DisplayImageOptions.Builder() 
       .showImageOnLoading(R.drawable.ic_mission) 
       .showImageForEmptyUri(R.drawable.ic_empty) 
       .showImageOnFail(R.drawable.ic_error).cacheInMemory(true) 
       .cacheOnDisk(true).considerExifParams(true) 
       .bitmapConfig(Bitmap.Config.RGB_565).build(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.teacherinfo_layout, 
       container, false); 
     mContext = container.getContext(); 
     lvItem = (ListView) rootView.findViewById(R.id.lvTeacher); 
     data = new ArrayList<ItemTeacher>(); 
     adapter = new InfoTeacher(mContext, data); 

     lvItem.setOnScrollListener(new EndlessScrollListener() { 

      @Override 
      public void onLoadMore(int page, int totalItemsCount) { 
       CurrentPage++; 
       customLoadMoreDataFromApi(CurrentPage); 

      } 
     }); 
     imageloader = ImageLoader.getInstance(); 
     imageloader.init(ImageLoaderConfiguration.createDefault(mContext)); 
     if (Utils.isOnline(mContext) == true 
       && Utils.KEY_CHECK_SUCCESS.equals("SUCCESS")) { 
      loadDataFromServer(URL + startPage); 
     } else if (Utils.isOnline(mContext) == true 
       && Utils.KEY_CHECK_SUCCESS.equals("FAIL")) { 
      Utils.MyToast(Utils.KEYWORK_ERROR[0], R.drawable.warning_icon, 
        mContext, false); 
     } 
     isInitList = true; 
     lvItem.setAdapter(adapter); 

     lvItem.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> adapter1, View view, 
        int position, long id) { 

       Intent intent = new Intent(mContext, NewsItemView.class); 
       if (!adapter.getItem(position).getLink().get(position) 
         .equalsIgnoreCase("")) { 
        Bundle bundle = new Bundle(); 
        bundle.putSerializable(NewsItemView.ITEM_TEACHER, 
          adapter.getItemId(position)); 
        bundle.putInt(NewsItemView.POSITION, position); 
        intent.putExtras(bundle); 
        startActivity(intent); 
       } 
      } 
     }); 
     return rootView; 
    } 

    private void loadDataFromServer(String URL) { 
     LoadData loadData = new LoadData() { 
      @Override 
      protected void onPostExecute(ArrayList<ItemTeacher> result) { 
       super.onPostExecute(result); 
       updateListView(result); 
      } 
     }; 
     loadData.execute(URL); 

    } 
    boolean isInitList = false; 
    protected void updateListView(ArrayList<ItemTeacher> result) { 
     if (!isInitList) { 
      data.addAll(result); 
     } 
     isInitList = false; 
// else{ 
//   isInitList = false; 
//   adapter.clear(); 
//   adapter.addAll(result); 
//  } 
     adapter.clear(); 
     adapter.addAll(result); 
     adapter.notifyDataSetChanged(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     AnimateFirstDisplayListener.displayedImages.clear(); 
    } 

    class LoadData extends AsyncTask<String, Void, ArrayList<ItemTeacher>> { 

     @Override 
     protected void onPreExecute() { 
      pDialog = ProgressDialog.show(mContext, "", Utils.KEYWORK_ERROR[2]); 
      data = new ArrayList<ItemTeacher>(); 
      super.onPreExecute(); 
     } 

     @Override 
     protected ArrayList<ItemTeacher> doInBackground(String... params) { 
      data = Utils.getInformationTeacher(params[0]); 
      return data; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<ItemTeacher> result) { 
      if (result != null) { 
       pDialog.dismiss(); 
      } else if (result == null) { 
       pDialog.dismiss(); 
       Utils.MyToast(Utils.KEYWORK_ERROR[0], R.drawable.warning_icon, 
         mContext, false); 
      } 
      super.onPostExecute(result); 
     } 

    } 

    class InfoTeacher extends ArrayAdapter<ItemTeacher> { 

     private LayoutInflater inflater; 
     ImageLoadingListener animateFirstListener; 
     List<ItemTeacher> item = new ArrayList<ItemTeacher>(); 

     public InfoTeacher(Context context, List<ItemTeacher> objects) { 
      super(context, -1, objects); 
      this.item = objects; 
      inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      animateFirstListener = new AnimateFirstDisplayListener(); 

     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup arg2) { 
      ItemTeacher itemTeacher = getItem(position); 
      ViewHolder holder; 
      if (convertView == null) { 
       holder = new ViewHolder(); 
       convertView = inflater.inflate(R.layout.teacher_layout, arg2, 
         false); 
       holder.Name = (TextView) convertView 
         .findViewById(R.id.tv_NameTeacher); 
       holder.School = (TextView) convertView 
         .findViewById(R.id.tv_School); 
       holder.ic_naviga = (ImageView) convertView 
         .findViewById(R.id.ivNaviga); 
       holder.icon = (ImageView) convertView 
         .findViewById(R.id.iv_IconTeacher); 
       convertView.setTag(holder); 
      } else 
       holder = (ViewHolder) convertView.getTag(); 

      holder.Name.setText(itemTeacher.getName().get(position)); 
      holder.School.setText(itemTeacher.getSchool().get(position)); 
      return convertView; 
     } 

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

    } 

    static class ViewHolder { 
     ImageView icon; 
     TextView Name; 
     TextView School; 
     ImageView ic_naviga; 
    } 

    private static class AnimateFirstDisplayListener extends 
      SimpleImageLoadingListener { 

     static final List<String> displayedImages = Collections 
       .synchronizedList(new LinkedList<String>()); 

     @Override 
     public void onLoadingComplete(String imageUri, View view, 
       Bitmap loadedImage) { 
      if (loadedImage != null) { 
       ImageView imageView = (ImageView) view; 
       boolean firstDisplay = !displayedImages.contains(imageUri); 
       if (firstDisplay) { 
        FadeInBitmapDisplayer.animate(imageView, 500); 
        displayedImages.add(imageUri); 
       } 
      } 
     } 
    } 

    public void customLoadMoreDataFromApi(int page) { 
     loadDataFromServer(URL + page); 
    } 

} 

和目标ItemTeacher

public class ItemTeacher { 

    private ArrayList<String> name = new ArrayList<String>(); 
    private ArrayList<String> icon = new ArrayList<String>(); 
    private ArrayList<String> link = new ArrayList<String>(); 
    private ArrayList<String> school = new ArrayList<String>(); 


    public ItemTeacher(){ 

    } 

    public ArrayList<String> getIcon() { 
     return icon; 
    } 

    public ArrayList<String> getLink() { 
     return link; 
    } 

    public ArrayList<String> getName() { 
     return name; 
    } 

    public ArrayList<String> getSchool() { 
     return school; 
    } 

    public void setIcon(ArrayList<String> icon) { 
     this.icon = icon; 
    } 

    public void setLink(ArrayList<String> link) { 
     this.link = link; 
    } 

    public void setName(ArrayList<String> name) { 
     this.name = name; 
    } 

    public void setSchool(ArrayList<String> school) { 
     this.school = school; 
    } 
} 

而且给我的错误 “空指针异常”

01-02 06:26:23.105: E/InputEventReceiver(1281): Exception dispatching input event. 
01-02 06:26:23.121: E/AndroidRuntime(1281): FATAL EXCEPTION: main 
01-02 06:26:23.121: E/AndroidRuntime(1281): java.lang.IndexOutOfBoundsException: Invalid index 30, size is 30 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at java.util.ArrayList.get(ArrayList.java:304) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.readnews.main.InfoTeacherFragment$InfoTeacher.getView(InfoTeacherFragment.java:227) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.widget.AbsListView.obtainView(AbsListView.java:2143) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.widget.ListView.makeAndAddView(ListView.java:1831) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.widget.ListView.fillDown(ListView.java:674) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.widget.ListView.fillGap(ListView.java:638) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4930) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3087) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.widget.AbsListView.onTouchEvent(AbsListView.java:3361) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.View.dispatchTouchEvent(View.java:7246) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2168) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1903) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.app.Activity.dispatchTouchEvent(Activity.java:2410) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.View.dispatchPointerEvent(View.java:7426) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:171) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4342) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4382) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.Choreographer.doFrame(Choreographer.java:530) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.os.Handler.handleCallback(Handler.java:725) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.os.Handler.dispatchMessage(Handler.java:92) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.os.Looper.loop(Looper.java:137) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
01-02 06:26:23.121: E/AndroidRuntime(1281):  at dalvik.system.NativeStart.main(Native Method) 
+0

NullPointerException发生在哪里? – nasch

+0

是你的stacktrace太难看了吗? :) – injecteer

+0

哦不...现在我想追加价值到arraylist名称学校,当我有新的数据 –

回答

0

非常现成的,袖口,和,不知道我理解的问题,但是,我'm不确定该for循环应该在那里:

protected void updateListView(ArrayList<ItemTeacher> result) { 
    for (int i = 0, n = result.size(); i < n; i++) { 
     adapter.addAll(result); 
    } 
    adapter.notifyDataSetChanged(); 
} 

这里是我更新ArrayList的地方。尝试使用.clear():

myAdapter.clear(); 
myAdapter.addAll(myDisplayList); 
myAdapter.notifyDataSetChanged(); 
+0

对不起...我说英语不好。请跟踪我的更新问题。 –