2015-10-23 2 views
0

Это мой класс активности, где у меня есть spinner.I нужно загрузить значения базы данных в spinner, поэтому, используя ArrayList и ArrayAdapter, я сделал это.Исключительное исключение указателя при загрузке элементов на счетчик

Но когда я запускаю свое приложение, оно дает исключение Null pointer.

public class addexpense extends ActionBarActivity { 

    DBhelper helper; 
    SQLiteDatabase db; 
    Spinner spinner; 

    @Override 
    /** Called when the activity is first created. */ 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.addexpenses); 


     ArrayList<category> mArrayList = helper.getCategories(); 
     Spinner sp =(Spinner)findViewById(R.id.spinner); 
     ArrayAdapter adapter =new ArrayAdapter(this,R.layout.spinner_row,mArrayList); 
     sp.setAdapter(adapter); 

    } 

} 

Это мой метод в классе базы данных DBHelper

 public class DBhelper extends SQLiteOpenHelper{ 

    static final String DATABASE = "wedding9.db"; 
    static final int VERSION = 9; 
    static final String TABLE1 = "Category"; 
    static final String TABLE2 = "Budget"; 


    static final String C_ID = "_id"; 
    static final String Name = "name"; 
    static final String B_ID = "_id"; 
    static final String Description = "description"; 
    static final String Amount = "amount"; 



    public DBhelper(Context context){ 
     super(context, DATABASE, null, VERSION); 
    } 

    public void onCreate(SQLiteDatabase db){ 

     db.execSQL("CREATE TABLE " + TABLE1+ "(" +C_ID 
       + " INTEGER PRIMARY KEY AUTOINCREMENT," +Name+ " text unique not null)"); 

     db.execSQL("CREATE TABLE " + TABLE2+ "(" +B_ID 
       + " INTEGER PRIMARY KEY AUTOINCREMENT," +Description+ " text," 
       +Amount+ " text, FOREIGN KEY ("+Description+") REFERENCES "+TABLE1+"("+Name+"));"); 
//  db.execSQL("CREATE TABLE " + TABLE2+ "(" +B_ID 
//    + " INTEGER PRIMARY KEY AUTOINCREMENT," +Amount+ " text)"); 


    } 

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     db.execSQL("drop table " + TABLE1); 


     onCreate(db); 
    } 

    public ArrayList<category> getCategories(){ 
     ArrayList<category> arrayList = new ArrayList<category>(); 
     SQLiteDatabase db = getReadableDatabase(); 
     Cursor c = db.query(DBhelper.TABLE1, null, null, null, null, null, null); 
//  c.moveToFirst(); 
     while (c.moveToNext()) { 
      category cat = new category(c.getInt(0),c.getString(1)); 
      arrayList.add(cat); 
     } 

     return arrayList; 
    } 
    public boolean checkIdExist(String name) { 
     SQLiteDatabase db = getReadableDatabase(); 
     Cursor c = db.query(DBhelper.TABLE1, null, null, null, null, null, null); 
//  c.moveToFirst(); 
     while (c.moveToNext()) { 
      if(c.getString(1).equals(name)) 
       return false; 
     } 

     return true; 
    } 
} 

Это категория класс

public class category 
{ 
    private int id; 
    private String name; 

    public category(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

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

Ниже один является исключением, я получил, когда я запустить приложение

10-23 08: 29: 21.482 3075-3075/com.example.user name.weddingplanning E/AndroidRuntime: неустранимый: Главный java.lang.RuntimeException: Невозможно запустить активность ComponentInfo {com.example.username.weddingplanning/com.example.username.weddingplanning.addexpense}: java.lang.NullPointerException на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2250) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2304) в android.app.ActivityThread.access $ 700 (ActivityThread.java:152) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1284) на android.os.Handler.dispatchMessage (Handler.java:99) на android.os.Looper.loop (Looper.java:176) на android.app.Acti vityThread.main (ActivityThread.java:5299) по адресу java.lang.reflect.Method.invokeNative (собственный метод) по адресу java.lang.reflect.Method.invoke (Method.java:511) at com.android.internal .os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1102) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:869) на dalvik.system.NativeStart.main (Native Method) Вызванный by: java.lang.NullPointerException at com.example.username.weddingplanning.addexpense.onCreate (addexpense.java:43) at android.app.Activity.performCreate (Activity.java:5326) at android.app.Instrumentation .callActivityOnCreate (Instrumentation.java:1097) на android.app.ActivityThread.performLaunchAct (ActivityThread.java:2213) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2304) на android.app.ActivityThread.access $ 700 (ActivityThread.java:152) на android.app.ActivityThread $ H .handleMessage (ActivityThread.java:1284) на android.os.Handler.dispatchMessage (Handler.java:99) на android.os.Looper.loop (Looper.java:176) на android.app.ActivityThread.main (ActivityThread.java:5299) по адресу java.lang.reflect.Method.invokeNative (собственный метод) по адресу java.lang.reflect.Method.invoke (Method.java:511) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1102) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:869) at dalvik.system.NativeStart.main (Родной метод)

+0

где ваша кнопка в addexpense? Можете ли вы опубликовать его? – Hoo

ответ

0

Создайте свой экземпляр-помощник первым.
хелпер не имеет значения helper.getCategories(); есть проблема.

+0

'10-23 09: 06: 59.571 8798-8798/com.example.username.weddingplanning E/ArrayAdapter: вы должны указать идентификатор ресурса для TextView 10-23 09: 06: 59.601 8798-8798/com.example .username.weddingplanning E/AndroidRuntime: FATAL EXCEPTION: main java.lang.IllegalStateException: ArrayAdapter требует, чтобы идентификатор ресурса был TextView ' – xyz

+0

' ArrayAdapter adapter = new ArrayAdapter (это, R.layout.spinner_row, R.id. tv, mArrayList); «После того, как я изменил эту строку, он работает – xyz

+0

, но в spinner' com.example.username.weddingplan.category @ 41a1da80' значения поступают в этом формате – xyz

0

вы должны реализовать адаптер Array (расширение до ArrayAdapter). и переопределить getDropDownView.

это для образца.

public class CategorySpinnerAdapter extends ArrayAdapter<Category> { 

    List<Category> list = new ArrayList<>(); 

    private Context context; 

    public CategorySpinnerAdapter(Context context, int resource, Category[] categories) { 
     super(context, resource, categories); 

     this.context = context; 
    } 

    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
     return getMyView(position, convertView, parent); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     return getMyView(position, convertView, parent); 
    } 


    private View getMyView(int position, View convertView, ViewGroup parent){ 
     CSViewHolder viewHolder; 
     if(convertView == null){ 
      convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.category_spinner_row, parent, false); 
      viewHolder = new CSViewHolder(convertView); 
      convertView.setTag(viewHolder); 
     }else{ 
      viewHolder = (CSViewHolder)convertView.getTag(); 
     } 

     viewHolder.fill(list.get(position)); 

     return convertView; 
    } 

    /** 
    * Load channel list 
    * @param cursor 
    */ 
    public void setList(Cursor cursor){ 
     list.clear(); 
     Log.i(getClass().getName(), String.valueOf(cursor)); 
     for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { 

      // The Cursor is now set to the right position 
      Category category = new Category(); 

      category.setTitle(CursorUtil.getStringColumnFromCursor(cursor, GoftagramContract.CategoryEntry.COLUMN_TITLE)); 
      category.setId(CursorUtil.getStringColumnFromCursor(cursor, GoftagramContract.CategoryEntry.COLUMN_SERVER_ID)); 
      list.add(category); 
     } 
    } 




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

    @Override 
    public Category getItem(int position) { 
     return list.get(position); 
    } 

    class CSViewHolder{ 
     private TextView titleView; 
     private ImageView thumbnailView; 

     public CSViewHolder(View itemView){ 

      titleView = (TextView)itemView.findViewById(R.id.category_spinner_row_title); 
      thumbnailView = (ImageView)itemView.findViewById(R.id.category_spinner_row_image); 

     } 

     public void fill(Category category){ 
      titleView.setText(category.getTitle()); 

      if(!TextUtils.isEmpty(category.getThumbnail())){ 
       Glide.with(context) 
         .load(category.getThumbnail()) 
         .into(thumbnailView); 
      }else{ 
       thumbnailView.setImageResource(R.drawable.ic_discuss); 
      } 

     } 
    } 
} 

для использования адаптера

categorySpinnerAdapter = new CategorySpinnerAdapter(this, R.layout.category_spinner_row, new Category[]{}); 
+0

, если решен ваша проблема, пожалуйста, примите мой ответ. – MHossein

Смежные вопросы