2016-08-28 102 views
0

我在Activity中使用了相同的代碼,它工作正常。但同樣的事情在Fragment不起作用。我已經放置了一些測試來檢查數據庫是否正確創建,並發現數據填充了cursorsetAdapter在片段Android中不起作用

下面是代碼:

public class Db_fragment extends Fragment { 
    View view; 
    ListView listView; 
    Db_listView_Adapter db_listView_adapter; 

    public Db_fragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.db_fragment, container, false); 
     return view; 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     final MyDatabaseOpenHelper mDbHelper = new MyDatabaseOpenHelper(view.getContext()); 


     final EditText foodName = (EditText) view.findViewById(R.id.nameForDb); 
     Button enterData = (Button) view.findViewById(R.id.enterData); 
     Button showData = (Button) view.findViewById(R.id.showData); 

     enterData.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       SQLiteDatabase myDb = mDbHelper.getWritableDatabase(); 
       ContentValues contentValues = new ContentValues(); 
       contentValues.put(TableFoodMacros.FoodMacros.FOOD_NAME,foodName.getText().toString()); 
       long newRowId ; 
       newRowId = myDb.insert(TableFoodMacros.FoodMacros.TABLE_NAME,null,contentValues); 
       Log.e("TEST1","TEST INSERT " + String.valueOf(newRowId)); 

      } 
     }); 

     showData.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       SQLiteDatabase myDb = mDbHelper.getReadableDatabase(); 

       String[] projection = {"_id",TableFoodMacros.FoodMacros.FOOD_NAME}; 

       Cursor c = myDb.query(
         TableFoodMacros.FoodMacros.TABLE_NAME, 
         projection, 
         null, 
         null, 
         null, 
         null, 
         null, 
         null 
       ); 

       Log.e("TEST3", String.valueOf(c.getCount())); 
       listView = (ListView) view.findViewById(R.id.dbView); 
       db_listView_adapter = new Db_listView_Adapter(view.getContext(),c); 
       listView.setAdapter(db_listView_adapter); 

      } 
     }); 

    } 
} 

在這條線的應用程序崩潰:

listView.setAdapter(db_listView_adapter); 
+0

是什麼錯誤消息說? – Shaishav

回答

0

您需要從showDataonClickListener刪除dbViewfindViewById並將其放置在onCreateView

請刪除以下內容。

showData.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 

     // ... Remove the following code segment from here. 
     listView = (ListView) view.findViewById(R.id.dbView); 
     db_listView_adapter = new Db_listView_Adapter(view.getContext(),c); 
     listView.setAdapter(db_listView_adapter); 

    } 
}); 

將代碼段放在onCreateView函數中。

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    view = inflater.inflate(R.layout.db_fragment, container, false); 

    // Place the code segment here 
    listView = (ListView) view.findViewById(R.id.dbView); 
    db_listView_adapter = new Db_listView_Adapter(view.getContext(),c); 
    listView.setAdapter(db_listView_adapter); 

    return view; 
} 

它可以在你的Activity因爲你沒有找到ListView ID在View返回。一旦你設置了你的Activity的內容視圖,你可以將findViewById放置在任何地方,它會完美地找到相關的佈局參考。

Fragment的情況下,如您所見,onCreateView函數返回一個View對象作爲充氣的View的參考。所以你需要找到你的ListView在那View。這就是爲什麼你需要把view.findViewByIdView這是膨脹的搜索參考編號ListView

當你把listView = (ListView) view.findViewById(R.id.dbView);showData.setOnClickListener裏面獲取按鈕showData的參考,並試圖找到dbViewButton鑑於這將導致錯誤。

因此,它需要在onCreateView的內部獲得您的列表的引用並在那裏設置適配器。然後,您可以在cursor充滿數據時輕鬆地撥打notifyDatasetChanged()以重新加載您的列表。

順便說一句,您可以將代碼段放入您的onViewCreated函數中,因爲您看到可以從此處獲得showData按鈕的引用而沒有任何問題。所以你甚至可以把代碼段放在那裏。

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    final MyDatabaseOpenHelper mDbHelper = new MyDatabaseOpenHelper(view.getContext()); 


    final EditText foodName = (EditText) view.findViewById(R.id.nameForDb); 
    Button enterData = (Button) view.findViewById(R.id.enterData); 
    Button showData = (Button) view.findViewById(R.id.showData); 

    // You can place the code segment here too 
    listView = (ListView) view.findViewById(R.id.dbView); 
    db_listView_adapter = new Db_listView_Adapter(view.getContext(),c); 
    listView.setAdapter(db_listView_adapter); 

    // ... Other code goes here. 
} 

,你可能會修改showData.setOnClickListener這樣

showData.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      SQLiteDatabase myDb = mDbHelper.getReadableDatabase(); 

      String[] projection = {"_id",TableFoodMacros.FoodMacros.FOOD_NAME}; 

      Cursor c = myDb.query(
        TableFoodMacros.FoodMacros.TABLE_NAME, 
        projection, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null 
      ); 

      Log.e("TEST3", String.valueOf(c.getCount())); 

      // Call notifyDatasetChanged when the cursor is filled with data to load the list. 
      db_listView_adapter.notifyDatasetChanged(); 

     } 
    }); 
相關問題