2012-02-27 62 views
4

我得到這樣的錯誤,當我跑我的應用程序:定製的ListView獲得NullPointerException異常

02-27 22:59:19.331: E/AndroidRuntime(2060): FATAL EXCEPTION: main 
02-27 22:59:19.331: E/AndroidRuntime(2060): java.lang.NullPointerException 
02-27 22:59:19.331: E/AndroidRuntime(2060):  
     at myPlanAdapter.getView(MyPlanActivity.java:145) 
     02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.widget.AbsListView.obtainView(AbsListView.java:1315) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1198) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.widget.ListView.onMeasure(ListView.java:1109) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.view.View.measure(View.java:8171) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:381) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:304) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.view.View.measure(View.java:8171) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.view.View.measure(View.java:8171) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.view.View.measure(View.java:8171) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.view.ViewRoot.performTraversals(ViewRoot.java:801) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.os.Looper.loop(Looper.java:123) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at java.lang.reflect.Method.invokeNative(Native Method) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at java.lang.reflect.Method.invoke(Method.java:521) 
    02-27 22:59:19.331: E/AndroidRuntime(2060):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 

而且我的源代碼是:

public class MyPlanActivity extends Activity implements OnItemClickListener, 
     OnClickListener { 
    private String TAG = "MyPlanActivity"; 
    private Button addButton = null; 
    private ListView listView; 
    myPlanAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     viewInit(); 
     adapter = new myPlanAdapter(getBaseContext()); 
     listView.setAdapter(adapter); 
     listView.setOnItemClickListener(this); 

    } 

    private void viewInit() { 
     setContentView(R.layout.myplan); 
     addButton = (Button) findViewById(R.id.AddMyPlanButtonId); 
     listView = (ListView) findViewById(R.id.myPlanListViewId); 
     addButton.setOnClickListener(this); 

    } 

    public void onClick(View v) { 
     switch (v.getId()) { 
     case R.id.AddMyPlanButtonId: 
      startActivity(new Intent(this, AddMyPlan.class)); 
      break; 

     default: 
      break; 
     } 
    } 

    public void onItemClick(AdapterView<?> paramAdapterView, View paramView, 
      int paramInt, long paramLong) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     adapter.notifyDataSetChanged(); 
    } 

    private class myPlanAdapter extends ArrayAdapter<MyPlan> { 
     Context context; 
     MyPlanDataSource dataSource; 

     public myPlanAdapter(Context context) { 
      super(context, R.layout.myplan_list_view_entry); 
      this.context = context; 
      dataSource = new MyPlanDataSource(context); 
     } 

     private ArrayList<MyPlan> getAllPlan() { 

      dataSource.open(); 
      ArrayList<MyPlan> allPlan = dataSource.getAllPlan(); 
      dataSource.close(); 
      Log.d(TAG,allPlan.get(0).getSubjectName()); 
      return allPlan; 
     } 

     @Override 
     public int getCount() { 
      Log.d(TAG,"Size: "+getAllPlan().size()); 
      return getAllPlan().size(); 
     } 

     @Override 
     public MyPlan getItem(int position) { 
      return getAllPlan().get(position); 
     } 

     @Override 
     public View getView(final int position, View convertView, 
       ViewGroup parent) { 
      View row = convertView; 
      if (row == null) 
      { 
       LayoutInflater inflater = (LayoutInflater) context 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       row = inflater.inflate(R.layout.myplan_list_view_entry, parent, 
         false); 

       final PlanViewHolder viewHolder = new PlanViewHolder(); 

       viewHolder.subjectName = (TextView) findViewById(R.id.myPlanListSubNameTextViewId); 
       viewHolder.targetGrade = (TextView) findViewById(R.id.myPlanListTargetGradeTextViewId); 
       viewHolder.duration = (TextView) findViewById(R.id.myPlanListDurationTextViewId); 
       viewHolder.examDate = (TextView) findViewById(R.id.myPlanListExamDateTextViewId); 
       viewHolder.daysTogo = (TextView) findViewById(R.id.myplanListDaystogoBoardTextViewId); 
       viewHolder.delete = (ImageView) findViewById(R.id.myPlanDeleteImageViewId); 
       Log.d(TAG, "" + position); 

       row.setTag(viewHolder); 
      } 
      final PlanViewHolder holder = (PlanViewHolder) row.getTag(); 


      holder.subjectName.setText((getAllPlan().get(position) 
        .getSubjectName())); // line 145 
      holder.targetGrade.setText("Grade : " 
        + getAllPlan().get(position).getTargetGrade()); 
      holder.duration.setText(getAllPlan().get(position).getExamTime()); 
      holder.examDate.setText(getAllPlan().get(position).getExamDate()); 



      holder.daysTogo.setText(getAllPlan().get(position).getDaysTogo()); 

      holder.delete.setOnClickListener(new OnClickListener() { 

       public void onClick(View v) { 
        AlertDialog.Builder builder = new AlertDialog.Builder(
          context); 
        builder.setTitle("DELETE") 
          .setMessage(
            "Are you sure you want to delete this Subject?") 
          .setCancelable(false) 
          .setPositiveButton("Yes", 
            new DialogInterface.OnClickListener() 
            { 
             public void onClick(
               DialogInterface dialog, int id) 
             { 

              dataSource.open(); 
              dataSource 
                .deletePlan(getItem(position)); 
              dataSource.close(); 
              notifyDataSetChanged(); 
             } 
            }) 
          .setNegativeButton("No", 
            new DialogInterface.OnClickListener() 
            { 
             public void onClick(
               DialogInterface dialog, int id) 
             { 
              dialog.cancel(); 
             } 
            }); 
        AlertDialog alert = builder.create(); 
        alert.show(); 

       } 
      }); 


      return row; 
     } 
    } 

    static class PlanViewHolder { 
     private TextView subjectName; 
     private TextView targetGrade; 
     private TextView duration; 
     private TextView examDate; 
     private TextView daysTogo; 
     private ImageView delete; 
    } 

} 
+0

哪一行是145? – Royi 2012-02-27 16:06:44

+0

在第145行上添加了一條評論。 – asish 2012-02-28 06:14:29

+0

重新運行並雙擊你的logcat錯誤.... – 2012-02-28 06:48:28

回答

5

我想你searcing你行的看法在錯誤的地方。試着找到他們在充氣排view(在getView()法):

viewHolder.subjectName = (TextView) row.findViewById(R.id.myPlanListSubNameTextViewId); 
viewHolder.targetGrade = (TextView) row.findViewById(R.id.myPlanListTargetGradeTextViewId); 
viewHolder.duration = (TextView) row.findViewById(R.id.myPlanListDurationTextViewId); 
viewHolder.examDate = (TextView) row.findViewById(R.id.myPlanListExamDateTextViewId); 
viewHolder.daysTogo = (TextView) row.findViewById(R.id.myplanListDaystogoBoardTextViewId); 
viewHolder.delete = (ImageView) findViewById(R.id.myPlanDeleteImageViewId); 
+0

是的,我錯過了。問題解決了。 非常感謝:) – asish 2012-02-28 06:59:57

0

進行這些改變你getView()方法:

@Override 
     public View getView(final int position, View convertView, 
       ViewGroup parent) 
     { 
      final PlanViewHolder viewHolder; 

      if (row == null) 
      { 
       LayoutInflater inflater = (LayoutInflater) context 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = inflater.inflate(R.layout.myplan_list_view_entry, parent, 
         false); 

       viewHolder = new PlanViewHolder(); 

       viewHolder.subjectName = (TextView) findViewById(R.id.myPlanListSubNameTextViewId); 
       viewHolder.targetGrade = (TextView) findViewById(R.id.myPlanListTargetGradeTextViewId); 
       viewHolder.duration = (TextView) findViewById(R.id.myPlanListDurationTextViewId); 
       viewHolder.examDate = (TextView) findViewById(R.id.myPlanListExamDateTextViewId); 
       viewHolder.daysTogo = (TextView) findViewById(R.id.myplanListDaystogoBoardTextViewId); 
       viewHolder.delete = (ImageView) findViewById(R.id.myPlanDeleteImageViewId); 
       Log.d(TAG, "" + position); 

       convertView.setTag(viewHolder); 
      } 
      else 
       viewHolder=(PlanViewHolder)convertView.getTag(); 
     ... 
     return convertView; 
} 
0

因爲這是你得到了NullPointerException行了,你需要弄清楚什麼是null

holder.subjectName.setText(
    (getAllPlan() 
    .get(position) 
    .getSubjectName())); 

這可能是調用getAllPlan()get(position)getSubjectName()

getAllPlan()方法返回什麼類型?並且這種類型的鍵與列表中的位置的值相同嗎?通過將代碼放在不同的行上,可以更容易地找到你得到null的地方。

此外,getAllPlan().get(position)將在ArrayAdapter返回相同的getItem(position)。在ViewHolder IDS

1

編輯,你需要從convertView(the view passed in)獲得這些ID是這樣的:

viewHolder.subjectName = (TextView) row.findViewById(R.id.myPlanListSubNameTextViewId); 

做同樣的他人。