2016-08-28 51 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(); 

     } 
    }); 
相关问题