2

나는 ListFragment 및 단추가있는 레이아웃이 있습니다. 단추를 클릭하면 새 Buchungstag 개체가 만들어져 데이터베이스에 저장됩니다. 이제 LoaderManager이이 변경을 감지하고 새 커서를 생성한다고 가정했습니다. 다음 ListFragment 새 개체를 표시해야하지만 아무 일도 발생하지 않습니다. 누군가 내가 틀린 곳을 말해 줄 수 있습니까? 이것은 BuchungstagFragment을 내 조각이라고LoaderManager 및 SimpleCursorAdapter를 사용하여 ListFragment를 채우는 방법?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.zeiterfassung); 
    buchungstagDAO = new BuchungstagDAO(getApplicationContext()); 

    Button kommen = (Button) findViewById(R.id.zeit_bntKommen); 
    kommen.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      LogWL.e(TAG, "button clicked"); 
      TBuchungstag tag = new TBuchungstag(); 
      tag.setDatum(new Date()); 
      tag.setFrueh(true); 
      tag.setMittag(false); 
      tag.setAbend(true); 
      tag.setNebenkosten(0.37d); 
      tag.setParkgebuehren(4.50d); 
      tag.setNebenkostenKommentar("billig"); 
      tag.setParkgebuehrenKommentar("parkhaus"); 
      tag.setAnwender(((WLAuToApplication) getApplication()).anwender); 
      tag.setReiseweg("Bochum - Muenster - Bochum"); 
      tag.setAendDatum(new Date()); 
      tag = buchungstagDAO.saveOrUpdate(tag); 
      LogWL.e(TAG, tag.getInterneId()+" saved"); 
     } 
    }); 
} 

: 이것은 내 활동에서 onCreate()는

public class BuchungstagFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> { 

    private BuchungstagSimpleCursorAdapter buchungstagCursorAdapter; 
    private Anwender anwender; 
    private Date syncDatum = Date.getInstance(1970, 1, 1); 
    private OnItemSelectedListener listener; 

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


    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     buchungstagCursorAdapter = new BuchungstagSimpleCursorAdapter(getActivity()); 
     setListAdapter(buchungstagCursorAdapter); 

     getLoaderManager().initLoader(0, null, this); 
    } 


    @Override 
    public void setArguments(Bundle args) { 
     super.setArguments(args); 
     this.anwender = (Anwender) args.get("anwender"); 
     this.syncDatum = (Date) args.get("syncDatum"); 
    } 

    private static final String[] COLUMNS = new String[] { BuchungstagTable._ID, BuchungstagTable.BUCHUNGSTAG_ID, 
      BuchungstagTable.FRUEH, BuchungstagTable.MITTAG, BuchungstagTable.ABEND, BuchungstagTable.NEBENKOSTEN, 
      BuchungstagTable.NEBENKOSTEN_KOMMENTAR, BuchungstagTable.PARKGEBUEHREN, 
      BuchungstagTable.PARKGEBUEHREN_KOMMENTAR, BuchungstagTable.SYNC_DATUM, BuchungstagTable.AEND_DATUM, 
      BuchungstagTable.UEB_DATUM, BuchungstagTable.DATUM, BuchungstagTable.ANWENDER_ID }; 

    /* 
    * (non-Javadoc) 
    * 
    * @see android.app.LoaderManager.LoaderCallbacks#onCreateLoader(int, 
    * android.os.Bundle) 
    */ 
    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     Uri baseUri = BuchungstagTable.CONTENT_URI; 
     return new CursorLoader(getActivity(), baseUri, COLUMNS, BuchungstagTable.SYNC_DATUM + " = ?", 
       new String[] { syncDatum.toString() }, null); 
    } 


    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
     buchungstagCursorAdapter.swapCursor(cursor); 
    } 


    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     buchungstagCursorAdapter.swapCursor(null); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     if (activity instanceof OnItemSelectedListener) { 
      listener = (OnItemSelectedListener) activity; 
     } else { 
      throw new ClassCastException(activity.toString() 
        + " muss BuchungstagFragment.OnItemSelectedListener implementieren!"); 
     } 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     TBuchungstag tag = (TBuchungstag) buchungstagCursorAdapter.getItem(position); 
     Bundle tagBundle = new Bundle(); 
     tagBundle.putSerializable("buchungstag", tag); 
     listener.onBuchungstagItemSelected(tagBundle); 
     getLoaderManager().restartLoader(0, null, this); 
    } 

    public interface OnItemSelectedListener { 
     public void onBuchungstagItemSelected(Bundle tagBundle); 
    } 

} 

이 내 BuchungstagSimpleCursorAdapter입니다 : 내 ContentProvider이있다

public class BuchungstagSimpleCursorAdapter extends SimpleCursorAdapter { 

    private static String[] COLUMNS = { BuchungstagTable.DATUM }; 

    private static int[] guifelder = { R.id.zeit_buchungstagTagLabel, R.id.zeit_buchungstagDatumLabel }; 

    private final LayoutInflater inflater; 
    private Context context; 

    public BuchungstagSimpleCursorAdapter(Context context) { 
     super(context, R.layout.zeiterf_buchungstag, null, COLUMNS, guifelder, 0); 
     inflater = LayoutInflater.from(context); 
     this.context = context; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see android.widget.SimpleCursorAdapter#bindView(android.view.View, 
    * android.content.Context, android.database.Cursor) 
    */ 
    @Override 
    public void bindView(View view, Context context, Cursor cur) { 
     Date d = new Date(cur.getLong(cur.getColumnIndex(BuchungstagTable.DATUM))); 
     String day = d.format("EEEE"); 
     String date = d.format("dd.MM.yyyy"); 

     TextView tag = (TextView) view.findViewById(R.id.zeit_buchungstagTagLabel); 
     tag.setHintTextColor(view.getResources().getColor(R.color.buchungstagTagColor)); 
     tag.setText(day); 

     TextView datum = (TextView) view.findViewById(R.id.zeit_buchungstagDatumLabel); 
     datum.setText(date); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View v = inflater.inflate(R.layout.zeiterf_buchungstag, parent); 
     return v; 
    } 
} 

그의 끝에 방법. 누군가가 왜 이것이 예상대로 작동하지 않는지 설명 할 수 있습니까?

답변

1

내 실수를 발견했습니다. 내 onCreateLoader() 메서드에서 커서가 데이터베이스에서 적합한 항목을 찾을 수 없도록하는 선택 인수를 전달했습니다. 인수를 제거한 후에는 로더가 의도 한대로 작동합니다.