2015-06-30 22 views
1

編輯2015年3月7日安卓:如果數據庫是空的,第一項被添加

我做了一些其他的進步片段不刷新。現在我有這個問題。如果數據庫是EMPTY(內部沒有值)並且我插入第一個值,則不會刷新片段。

如果在TextView的值(例如,我手動重新加載片段切換經由菜單或關閉應用或改變旋轉另一片段)和I插入新值,textviews刷新時刻。

我發佈一些其他的代碼,感謝您的幫助:

DashboardFragment.java

public class DashboardFragment extends Fragment { 

    private DateManager db = null; 
    private String last_event; 
    private TextView counter_day_placeholder,next_event_placeholder,no_data_found; 
    private String timeZone; 
    private View v; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     JodaTimeAndroid.init(getActivity()); 
     timeZone = SupportDate.getTimezone(); 

    } 

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

     setDashboard(); 
     setFab(); 

     return v; 
    } 

    private void setFab(){ 
     // BUTTON 
     FloatingActionButton newEventButton = (FloatingActionButton) v.findViewById(R.id.set_new_event); 
     newEventButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Calendar c = Calendar.getInstance(); 
       int mYear = c.get(Calendar.YEAR); 
       int mMonth = c.get(Calendar.MONTH); 
       int mDay = c.get(Calendar.DAY_OF_MONTH); 

       DatePickerDialog dialog = new DatePickerDialog(getActivity(), datePickerListener, mYear, mMonth, mDay); 

       /*dialog.setButton(DatePickerDialog.BUTTON_POSITIVE, "OK", dialog); 
       dialog.setButton(DialogInterface.BUTTON_POSITIVE,"OK",dialog.onDateChanged(DatePicker view););*/ 
       dialog.show(); 
      } 
     }); 
    } 

    private void setDashboard(){ 
     last_event = getLastEvent(); 
     counter_day_placeholder = (TextView) v.findViewById(R.id.counter_day_placeholder); 
     next_event_placeholder = (TextView) v.findViewById(R.id.next_event_placeholder); 
     if (last_event!=null){ 

      String next_event = SupportDate.addDayToDate(last_event, null, 28); 
      int day_to_next_event = SupportDate.getDifferenceBetweenDatesInDay(next_event, null, timeZone); 

      next_event = SupportDate.formatDate(next_event,null,null); 
      next_event_placeholder.setText(next_event); 

      counter_day_placeholder.setText(Integer.toString(day_to_next_event)); 
     } 
     else 
     { 
      no_data_found = (TextView) v.findViewById(R.id.no_data_found); 
      no_data_found.setVisibility(View.VISIBLE); 
      counter_day_placeholder.setVisibility(View.GONE); 
      next_event_placeholder.setVisibility(View.GONE); 
     } 

    } 

    private DatePickerDialog.OnDateSetListener datePickerListener 
      = new DatePickerDialog.OnDateSetListener() { 

     // when dialog box is closed, below method will be called. 
     public void onDateSet(DatePicker view, int selectedYear, 
           int selectedMonth, int selectedDay) { 

      String stringYear = Integer.toString(selectedYear); 

      selectedMonth = selectedMonth+1; 

      String stringMonth = Integer.toString(selectedMonth); 

      if (stringMonth.length()==1){ 
       stringMonth = "0"+stringMonth; 
      } 

      String stringDay = Integer.toString(selectedDay); 

      if (stringDay.length()==1){ 
       stringDay = "0"+stringDay; 
      } 

      String date = stringYear+"-"+stringMonth+"-"+stringDay+" 00:00:00"; 
      setEvent(date); 
      //last_event = getLastEvent(); 
      setDashboard(); 

     } 
    }; 

    private String getLastEvent(){ 
     last_event = null; 
     db=new DateManager(getActivity()); 
     Cursor cursor=db.getLastEvent(); 
     if (cursor.getCount()>0){ 
      cursor.moveToFirst(); 
      last_event = cursor.getString(1); 
     } 
     return last_event; 
    } 

    private void setEvent(String date){ 

     if (date==null){ 
      date = SupportDate.getCurrentDate(null,null); 
     } 
     db=new DateManager(getActivity()); 
     db.save(date); 
    } 

} 

這是dashboardfragment.xml。基本上,如果沒有事件在數據庫中,我刪除所有的文字瀏覽,但顯示與ID沒有數據找到(只顯示文字「找不到數據,請插入一個事件」)。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/relative_layout_dashboard_fragment"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/no_data_found" 
     android:textAppearance="@style/TextAppearance.AppCompat.Headline" 
     android:id="@+id/no_data_found" 
     android:visibility="gone" 
     android:layout_alignTop="@+id/view_anchor" 
     android:layout_centerHorizontal="true" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="@style/TextAppearance.AppCompat.Display4" 
     android:id="@+id/counter_day_placeholder" 
     android:text="-50" 
     android:layout_above="@+id/view_anchor" 
     android:layout_centerHorizontal="true" /> 

    <View 
     android:layout_width="5dp" 
     android:layout_height="5dp" 
     android:layout_alignWithParentIfMissing="false" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:id="@+id/view_anchor" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="@style/TextAppearance.AppCompat.Title" 
     android:id="@+id/next_event_placeholder" 
     android:text="01/01/2015" 
     android:layout_below="@+id/view_anchor" 
     android:layout_centerHorizontal="true" /> 


    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/set_new_event" 
     android:src="@drawable/ic_add_white_24dp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_margin="@dimen/fab_layout_margin" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" /> 


</RelativeLayout> 

=========================================== ============================

舊後,闊葉歷史數據

我需要刷新我的片段,因爲用戶可以從片段本身插入新數據。因此,當他/她關閉DatePickerDialog並將數據插入到Sqllite中時,我需要顯示新值。

這是從導航抽屜的片段來連接片段:

case R.id.dashboard: 

         DashboardFragment dashboardFragment = new DashboardFragment(); 
         FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
         fragmentTransaction.replace(R.id.frame, dashboardFragment,"DASHBOARD_FRAGMENT"); 
         fragmentTransaction.commit(); 
         return true; 

我的代碼不會刷新(無論是我在日誌中的錯誤)。非常感謝你。

public class DashboardFragment extends Fragment { 

    private DateManager db = null; 
    private String last_event; 
    private TextView counter_day_placeholder,next_event_placeholder,no_data_found; 
    private String timeZone; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     JodaTimeAndroid.init(getActivity()); 
     //setEvent(null); 
     last_event = getLastEvent(); 
     timeZone = SupportDate.getTimezone(); 

    } 

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

     setDashboard(v); 
     setFab(v); 

     return v; 
    } 

    private void setFab(View v){ 
     // BUTTON 
     FloatingActionButton newEventButton = (FloatingActionButton) v.findViewById(R.id.set_new_event); 
     newEventButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Calendar c = Calendar.getInstance(); 
       int mYear = c.get(Calendar.YEAR); 
       int mMonth = c.get(Calendar.MONTH); 
       int mDay = c.get(Calendar.DAY_OF_MONTH); 

       DatePickerDialog dialog = new DatePickerDialog(getActivity(), datePickerListener, mYear, mMonth, mDay); 

       /*dialog.setButton(DatePickerDialog.BUTTON_POSITIVE, "OK", dialog); 
       dialog.setButton(DialogInterface.BUTTON_POSITIVE,"OK",dialog.onDateChanged(DatePicker view););*/ 
       dialog.show(); 
      } 
     }); 
    } 

    private void setDashboard(View v){ 
     counter_day_placeholder = (TextView) v.findViewById(R.id.counter_day_placeholder); 
     next_event_placeholder = (TextView) v.findViewById(R.id.next_event_placeholder); 
     if (last_event!=null){ 

      String next_event = SupportDate.addDayToDate(last_event, null, 28); 
      int day_to_next_event = SupportDate.getDifferenceBetweenDatesInDay(next_event, null, timeZone); 

      next_event = SupportDate.formatDate(next_event,null,null); 
      next_event_placeholder.setText(next_event); 

      counter_day_placeholder.setText(Integer.toString(day_to_next_event)); 
     } 
     else 
     { 
      no_data_found = (TextView) v.findViewById(R.id.no_data_found); 
      no_data_found.setVisibility(View.VISIBLE); 
      counter_day_placeholder.setVisibility(View.GONE); 
      next_event_placeholder.setVisibility(View.GONE); 
     } 

    } 

    private DatePickerDialog.OnDateSetListener datePickerListener 
      = new DatePickerDialog.OnDateSetListener() { 

     // when dialog box is closed, below method will be called. 
     public void onDateSet(DatePicker view, int selectedYear, 
           int selectedMonth, int selectedDay) { 

      String stringYear = Integer.toString(selectedYear); 

      selectedMonth = selectedMonth+1; 

      String stringMonth = Integer.toString(selectedMonth); 

      if (stringMonth.length()==1){ 
       stringMonth = "0"+stringMonth; 
      } 

      String stringDay = Integer.toString(selectedDay); 

      if (stringDay.length()==1){ 
       stringDay = "0"+stringDay; 
      } 

      String date = stringYear+"-"+stringMonth+"-"+stringDay+" 00:00:00"; 
      setEvent(date); 

      // REFRESH FRAGMENT  

      Fragment fragment = getFragmentManager().findFragmentByTag("DASHBOARD_FRAGMENT"); 
      FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
      fragmentTransaction.replace(R.id.frame, fragment,"DASHBOARD_FRAGMENT"); 
      fragmentTransaction.commit(); 


     } 
    }; 

    private String getLastEvent(){ 
     last_event = null; 
     db=new DateManager(getActivity()); 
     Cursor cursor=db.getLastEvent(); 
     if (cursor.getCount()>0){ 
      cursor.moveToFirst(); 
      last_event = cursor.getString(1); 
     } 
     return last_event; 
    } 

    private void setEvent(String date){ 

     if (date==null){ 
      date = SupportDate.getCurrentDate(null,null); 
     } 
     db=new DateManager(getActivity()); 
     db.save(date); 
    } 

} 

**編輯**

我做了以下Shooky答案改變代碼,但片段不刷新。將視圖作爲類成員移動,沒有運氣。我只能用改變方向刷新片段(很明顯)。這是我第二次測試代碼:

public class DashboardFragment extends Fragment { 

    private DateManager db = null; 
    private String last_event; 
    private TextView counter_day_placeholder,next_event_placeholder,no_data_found; 
    private String timeZone; 
    private View v; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     JodaTimeAndroid.init(getActivity()); 
     //setEvent(null); 
     last_event = getLastEvent(); 
     timeZone = SupportDate.getTimezone(); 

    } 

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

     setDashboard(); 
     setFab(); 

     return v; 
    } 

    private void setFab(){ 
     // BUTTON 
     FloatingActionButton newEventButton = (FloatingActionButton) v.findViewById(R.id.set_new_event); 
     newEventButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Calendar c = Calendar.getInstance(); 
       int mYear = c.get(Calendar.YEAR); 
       int mMonth = c.get(Calendar.MONTH); 
       int mDay = c.get(Calendar.DAY_OF_MONTH); 

       DatePickerDialog dialog = new DatePickerDialog(getActivity(), datePickerListener, mYear, mMonth, mDay); 

       /*dialog.setButton(DatePickerDialog.BUTTON_POSITIVE, "OK", dialog); 
       dialog.setButton(DialogInterface.BUTTON_POSITIVE,"OK",dialog.onDateChanged(DatePicker view););*/ 
       dialog.show(); 
      } 
     }); 
    } 

    private void setDashboard(){ 
     counter_day_placeholder = (TextView) v.findViewById(R.id.counter_day_placeholder); 
     next_event_placeholder = (TextView) v.findViewById(R.id.next_event_placeholder); 
     if (last_event!=null){ 

      String next_event = SupportDate.addDayToDate(last_event, null, 28); 
      int day_to_next_event = SupportDate.getDifferenceBetweenDatesInDay(next_event, null, timeZone); 

      next_event = SupportDate.formatDate(next_event,null,null); 
      next_event_placeholder.setText(next_event); 

      counter_day_placeholder.setText(Integer.toString(day_to_next_event)); 
     } 
     else 
     { 
      no_data_found = (TextView) v.findViewById(R.id.no_data_found); 
      no_data_found.setVisibility(View.VISIBLE); 
      counter_day_placeholder.setVisibility(View.GONE); 
      next_event_placeholder.setVisibility(View.GONE); 
     } 

    } 

    private DatePickerDialog.OnDateSetListener datePickerListener 
      = new DatePickerDialog.OnDateSetListener() { 

     // when dialog box is closed, below method will be called. 
     public void onDateSet(DatePicker view, int selectedYear, 
           int selectedMonth, int selectedDay) { 

      String stringYear = Integer.toString(selectedYear); 

      selectedMonth = selectedMonth+1; 

      String stringMonth = Integer.toString(selectedMonth); 

      if (stringMonth.length()==1){ 
       stringMonth = "0"+stringMonth; 
      } 

      String stringDay = Integer.toString(selectedDay); 

      if (stringDay.length()==1){ 
       stringDay = "0"+stringDay; 
      } 

      String date = stringYear+"-"+stringMonth+"-"+stringDay+" 00:00:00"; 
      setEvent(date); 
      last_event = getLastEvent(); 
      setDashboard(); 

     } 
    }; 

    private String getLastEvent(){ 
     last_event = null; 
     db=new DateManager(getActivity()); 
     Cursor cursor=db.getLastEvent(); 
     if (cursor.getCount()>0){ 
      cursor.moveToFirst(); 
      last_event = cursor.getString(1); 
     } 
     return last_event; 
    } 

    private void setEvent(String date){ 

     if (date==null){ 
      date = SupportDate.getCurrentDate(null,null); 
     } 
     db=new DateManager(getActivity()); 
     db.save(date); 
    } 

} 
+0

這是使用接口和回調方法返回一個片段活動的對話片段 - 我覺得你可以考慮調整你的代碼中使用了類似的模式-http://stackoverflow.com/questions/12822250/dialogfragment-callback-面向方向的變化 –

回答

0

您的片段沒有刷新的原因是因爲你僅僅讓參照現有的片段,並試圖用自身來取代它。這不會導致onCreate或onCreateView函數再次被調用。

重塑片段不過是你正在嘗試做一個非常沉重的和不必要的操作。它從你的代碼出現,你可以簡單地刷新數據通過以下方式

last_event = getLastEvent(); 
setDashboard(v); 

要做到這一點,你需要通過聲明它作爲像這樣

private DateManager db = null; 
private String last_event; 
private TextView counter_day_placeholder,next_event_placeholder,no_data_found; 
private String timeZone; 
private View v; 
類變量以「V」的引用
+0

謝謝你的回答。做了你的改變,但沒有運氣。感謝您的支持... – sineverba

+0

您可以使用或實施回調? –

+0

@MarkKeen你能幫我發表一個答案嗎? – sineverba