2016-08-28 3 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

오류 메시지는 무엇을 말하는가에게 같은 showData.setOnClickListener을 수정할 수 있습니까? – 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 함수에 코드 세그먼트를 배치하십시오. 당신이 View 반환에 ListView ID를 찾을 수 없습니다로

@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에서 작동합니다. Activity의 콘텐츠보기를 설정하면 findViewById을 어디든지 둘 수 있으며 관련 레이아웃 참조를 완벽하게 찾을 수 있습니다. 당신이 보는대로

Fragment의 경우, onCreateView 기능은 팽창 된 View의 기준으로 View 개체를 반환합니다. 따라서 귀하는 에 ListView을 찾아야합니다. 따라서 view.findViewByIdListView의 참조 ID를 검색하려면 View이 부풀려 있어야합니다.

당신은 버튼 showData의 참조를 가져옵니다 오류를 유발하는 Button보기에서 dbView을 찾기 위해 시도하는 showData.setOnClickListener 내부의 listView = (ListView) view.findViewById(R.id.dbView); 퍼팅 할 때.

그래서 목록의 참조를 onCreateView 안에 넣고 어댑터를 설정해야합니다. cursor이 데이터로 가득 차면 notifyDatasetChanged()으로 전화를 걸어 목록을 다시 불러올 수 있습니다.

그런데 아무 문제없이 showData 버튼의 참조를 얻을 수 있다는 것을 알았 으면 코드 세그먼트를 onViewCreated 함수에도 넣을 수 있습니다. 따라서 코드 세그먼트도 배치 할 수 있습니다.

@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(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(); 

     } 
    }); 
관련 문제