[英]Android: fragment doesn't refresh if database is empty and first entry is added
編輯於03/07/2015
我取得了其他一些進展。 現在我有這個問題。 如果數據庫為EMPTY(內部沒有值)並且我插入第一個值,則片段不會刷新。
如果textview中有值(例如,我通過菜單或關閉應用程序或更改旋轉方式手動重新加載片段以切換另一個片段),然后插入新值,則立即刷新textview。
我發布了一些其他代碼,謝謝您的幫助:
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為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);
}
}
您的片段不刷新的原因是因為您只是獲取對現有片段的引用,並嘗試用其自身替換它。 這不會導致onCreate或onCreateView函數再次被調用。
但是,對於您要嘗試執行的操作,重新創建片段是非常繁瑣且不必要的操作。 從您的代碼看來,您可以通過以下方式簡單地刷新數據
last_event = getLastEvent();
setDashboard(v);
為此,您需要通過將其聲明為類變量來持有對“ 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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.