[英]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.