2015-01-13 3 views
0

Я хочу использовать Listview для отображения данных в базе данных SQLite. Я использую фрагмент, чтобы получить список. Но теперь у меня есть проблема:Android NullPointerException (getDatabaseLocked & getWritableDatabase)

This is the Log info: 
E/AndroidRuntime(12816): FATAL EXCEPTION: main 
E/AndroidRuntime(12816): java.lang.NullPointerException 
E/AndroidRuntime(12816): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 
E/AndroidRuntime(12816): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
E/AndroidRuntime(12816): at com.tax_ui.sql.Inform_dbHandler.getAllInform(Inform_dbHandler.java:80) 
E/AndroidRuntime(12816): at com.tax_ui.fragment.InformFragment.init(InformFragment.java:72) 
E/AndroidRuntime(12816): at com.tax_ui.fragment.InformFragment.onCreateView(InformFragment.java:55) 

Это код списка адаптер:

public class InformListAdapter extends BaseAdapter { 

    private Activity activity; 
    private LayoutInflater inflater; 
    private List<Inform_item> inform_item_list; 

    public InformListAdapter(Activity activity, 
      List<Inform_item> inform_item_list) { 
     this.activity = activity; 
     this.inform_item_list = inform_item_list; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return inform_item_list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return inform_item_list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     if (inflater == null) 
      inflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) 
      convertView = inflater.inflate(R.layout.fragment_inform_item, null); 

     TextView title = (TextView) convertView.findViewById(R.id.inform_title); 
     TextView timestamp = (TextView) convertView 
       .findViewById(R.id.inform_timestamp); 
     TextView content = (TextView) convertView 
       .findViewById(R.id.inform_content); 

     Inform_item inform_item = inform_item_list.get(position); 

     title.setText(inform_item.get_title()); 
     timestamp.setText(inform_item.get_timestamp()); 
     content.setText(inform_item.get_content()); 

     return null; 
    } 

} 

И потом, это мой фрагмент кода:

public class InformFragment extends Fragment { 

    private View mBaseView; 
    private TitleBarView mTitleBarView; 
    private ListView listView; 
    private InformListAdapter listAdapter; 
    private List<Inform_item> inform_item_list; 

    private Inform_dbHandler inform_dbHandler = new Inform_dbHandler(getActivity()); 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 

     getActivity(); 
     mBaseView=inflater.inflate(R.layout.fragment_inform_list, null); 
     findView(); 
     init(); 

     return mBaseView;  
    } 

    private void findView(){ 
     mTitleBarView=(TitleBarView) mBaseView.findViewById(R.id.title_bar); 
     listView = (ListView)mBaseView.findViewById(R.id.inform_list); 
    } 

    private void init(){ 
     mTitleBarView.setCommonTitle(View.GONE, View.VISIBLE, View.GONE); 
     mTitleBarView.setTitleText(R.string.inform); 

     inform_item_list = new ArrayList<Inform_item>(); 
     inform_item_list = inform_dbHandler.getAllInform(); 

     listAdapter = new InformListAdapter(getActivity(), inform_item_list); 
     listView.setAdapter(listAdapter); 
    } 

} 

Я думаю, что это может быть эта строка неверна:

private Inform_dbHandler inform_dbHandler = 
    new Inform_dbHandler(getActivity()); 

Но я не знаю, Не знаете, как решить эту проблему? Вы можете мне помочь? Спасибо ~

+1

показать код 'getAllInform' –

+0

Я понял, что не так: я показываю« return convertView »в InformListAdapter, а не« return null »! –

ответ

0

Изменить следующим образом:

private Inform_dbHandler inform_dbHandler ; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 

     getActivity(); 
     mBaseView=inflater.inflate(R.layout.fragment_inform_list, null); 
     findView(); 
     init(); 
     Inform_dbHandler inform_dbHandler = new Inform_dbHandler(getActivity()); 

     return mBaseView;  
    } 

Проблема вы создаете объект для dbhandler но это будет инициализироваться перед присоединением к этой деятельности. в этой ситуации метод getActivity() retuns null, поэтому база данных не будет разработана.

затем Лучшая практика, если вы хотите dbhelper объект класса глобально инициализировать этот объект в

OnAttach() фрагмента.

0

использовать этот код для InformListAdapter класса у вас есть только одна ошибка,

public class InformListAdapter extends BaseAdapter { 

    private Activity activity; 
    private LayoutInflater inflater; 
    private List<Inform_item> inform_item_list; 

    public InformListAdapter(Activity activity, 
      List<Inform_item> inform_item_list) { 
     this.activity = activity; 
     this.inform_item_list = inform_item_list; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return inform_item_list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return inform_item_list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     if (inflater == null) 
      inflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) 
      convertView = inflater.inflate(R.layout.fragment_inform_item, null); 

     TextView title = (TextView) convertView.findViewById(R.id.inform_title); 
     TextView timestamp = (TextView) convertView 
       .findViewById(R.id.inform_timestamp); 
     TextView content = (TextView) convertView 
       .findViewById(R.id.inform_content); 

     Inform_item inform_item = inform_item_list.get(position); 

     title.setText(inform_item.get_title()); 
     timestamp.setText(inform_item.get_timestamp()); 
     content.setText(inform_item.get_content()); 

     return convertView; 
    } 

} 
+1

Но в чем проблема? –

+0

Да, не могли бы вы объяснить, что было не так, и сосредоточиться на разделе проблем. – Andy

+0

, а также инициализировать вас dbHandler в методе 'onCreate'. Проблема с классом' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' была указана, что вы возвращали значение null в конце 'getView' –

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