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