2016-08-28 11 views
0

Activityで同じコードを使用しています。しかし、同じことはFragmentでは機能しません。 DBが正しく作成されているかどうかを確認するためにいくつかのテストを行い、cursorがデータで満たされていることがわかりました。フラグメントアダプターでsetAdapterが動作しない

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; 
} 

あなたが返さViewListView IDを見つけることがありませんように、それはあなたのActivityで動作します。 Activityのコンテンツビューを設定したら、findViewByIdをどこにでも置くことができ、関連付けられたレイアウトリファレンスを完全に見つけることができます。ご覧のように

Fragmentの場合、onCreateView機能が膨張するViewの基準としてViewオブジェクトを返します。だから、あなたのListViewViewであることが必要です。そのため、view.findViewByIdListViewの参照IDを検索するには、Viewが膨らんでいる必要があります。

あなたはshowData.setOnClickListenerlistView = (ListView) view.findViewById(R.id.dbView);を入れているとき、それはボタンshowDataの参照を取得し、エラーの原因となることButtonビューでdbViewを見つけようとします。

あなたのリストの参照を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(); 

     } 
    }); 
関連する問題