2014-05-17 28 views
0
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view; 
    ViewHolder holder; 

    if (null == convertView) { 
     view = inflater.inflate(R.layout.web_courses_list_item, null); 
     // Set table view color for each new row 
     view.setBackgroundColor(0xFFF0F0F0); 

     // Create the view holder 
     holder = new ViewHolder(); 
     holder.CourseName = (TextView) view.findViewById(R.id.course_name); 
     holder.CourseDesc = (TextView) view.findViewById(R.id.course_desc); 
     holder.DltButton = (Button) view.findViewById(R.id.btn_remove); 
     final int pos = position; 
     holder.DltButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(final View v) { 
       if(v==null) { 
        Log.v("RemoveCheck", "view v is null"); 
        return; 
       } 
       Builder builder = new Builder(mContext); 
       builder.setTitle("Alert!!!!"); 
       builder.setMessage("Are you sure you want to delete "+mCoursesList.get(pos).getName()); 
       builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         mCoursesList.get(pos).setVisible(false); 
         mCoursesList.remove(pos); 
         v.setVisibility(View.GONE); 
         CoursesChangeData(mCoursesList); 
        } 
       }); 

       builder.setNegativeButton("No", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
        } 
       }); 

       builder.create().show(); 
      } 
     }); 
     view.setTag(holder); 
    } else { 
     view = convertView; 
     holder = (ViewHolder) view.getTag(); 
    } 

    CourseData current = mCoursesList.get(position); 
    holder.CourseName.setText(current.getName()); 
    holder.CourseDesc.setText(current.getDesc()); 
    if (mCoursesList.get(position).isVisible()) 
     holder.DltButton.setVisibility(View.VISIBLE); 
    else 
     holder.DltButton.setVisibility(View.GONE); 
    return view; 
} 

嗨,我實現了baseAdapter的這種方法來處理點擊刪除按鈕。刪除按鈕是不可見的,直到ListView項刷卡,這使得它可見,當我觸摸刪除其崩潰,這裏是調用堆棧(的錯誤是從線builder.create().show(); ;這是行111):在處理onClick事件時getView中的空指針異常

05-17 21:56:15.579: E/AndroidRuntime(18584): FATAL EXCEPTION: main 
05-17 21:56:15.579: E/AndroidRuntime(18584): Process: com.example.webcourse, PID: 18584 
05-17 21:56:15.579: E/AndroidRuntime(18584): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
05-17 21:56:15.579: E/AndroidRuntime(18584): at android.view.ViewRootImpl.setView(ViewRootImpl.java:540) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at android.app.Dialog.show(Dialog.java:286) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at com.example.webcourse.CoursesListAdapter$1.onClick(CoursesListAdapter.java:111) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at android.view.View.performClick(View.java:4445) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at android.view.View$PerformClick.run(View.java:18429) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at android.os.Handler.handleCallback(Handler.java:733) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at android.os.Handler.dispatchMessage(Handler.java:95) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at android.os.Looper.loop(Looper.java:136) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at android.app.ActivityThread.main(ActivityThread.java:5081) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at java.lang.reflect.Method.invokeNative(Native Method) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at java.lang.reflect.Method.invoke(Method.java:515) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:781) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
05-17 21:56:15.579: E/AndroidRuntime(18584): at dalvik.system.NativeStart.main(Native Method) 
05-17 21:56:15.584: W/ActivityManager(2330): Force finishing activity com.example.webcourse/.CoursesActivity 
+0

什麼是87行? – user3535778

+2

final int pos =(Integer)v.getTag(); –

+0

v.getTag()爲空然後 – user3535778

回答

1

您將ViewHolder作爲標記設置爲視圖。但是當你調用getTag時,它被轉換爲int類型,這是問題。它不能是int,因此是例外。

+0

查看編輯後的版本,現在有什麼問題? –

+0

更改行 - Builder builder = new Builder(mContext); to Builder builder = new Builder(this); – essess

+0

構造函數AlertDialog.Builder(new View.OnClickListener(){})未定義 –

0

你無法知道上下文是否是最終的。 你應該使用:v.getContext()

0

你不能設置view.gone,視圖重用其他元素。 更改數據集後,您需要使適配器無效。因爲您從列表中刪除對象並且不會使其無效,所以適配器將嘗試訪問導致null pnt異常的最後一個元素。

檢查該線程Updating the list view when the adapter data changes