2016-11-24 73 views
5

在我的應用程序中,它有兩個選項卡,一個是提醒,另一個是已完成任務。刷卡選項卡中的ListView未更新,除非重新啓動

enter image description here

當點擊切換按鈕,我希望它在列表中移動到已完成任務。

的思路是:

  • 獲得從源碼
  • 選中的行ID檢索基於從提醒表ID的數據,並插入到已完成表。
  • 已完成選項卡中的呼叫檢索方法。

但是,當我點擊切換按鈕並滑動到完成,它仍然是空的。我退出應用程序後,滑動到Tab,只顯示數據。

如何在完成標籤刷新而不是退出應用程序並重新打開時立即顯示數據?感謝

AllAdapter(提醒)

holder.toggle.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (((ToggleButton)v).isChecked()) { 
         int getPosition = (Integer) v.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
         search.get(getPosition).setSelected(((ToggleButton) v).isChecked()); 
         int id= search.get(getPosition).getID(); 
         mdb = new MyDatabaseHelper(v.getContext()); 
         database = mdb.getReadableDatabase(); 
         Cursor cursor = database.rawQuery("SELECT * FROM " + MyDatabaseHelper.TABLE__TASK + " WHERE ID = ? ", new String[]{id+""}, null); 
         if (cursor != null && cursor.getCount() > 0) { 
          while (cursor.moveToNext()) { 
           String allTask = cursor.getString(cursor.getColumnIndex("Title")); 
           String name = cursor.getString(cursor.getColumnIndex("Name")); 
           String allTime = cursor.getString(cursor.getColumnIndex("Time")); 
           String allDate = cursor.getString(cursor.getColumnIndex("Date")); 
           insertDataToCompleteTab(id,name,allTask,allTime,allDate); // insert to another table 
          } 

         } 
        } else { 
         int getPosition = (Integer) v.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
         search.get(getPosition).setSelected(((ToggleButton) v).isChecked()); 
        } 
       } 
      }); 

CompletedTask

retrieveList(name); 

public void retrieveList(String name) { 
     Toast.makeText(getActivity(),name,Toast.LENGTH_SHORT).show(); 
     search.clear(); 
     database = mdb.getReadableDatabase(); 
     Cursor cursor = database.rawQuery("SELECT * FROM " + MyDatabaseHelper.TABLE_TASKCOMPLETED + " WHERE Name = ? ", new String[]{name}, null); 
     if (cursor != null && cursor.getCount() > 0) { 
      while (cursor.moveToNext()) { 
       int iD = cursor.getInt(cursor.getColumnIndex("ID")); 
       String allTask = cursor.getString(cursor.getColumnIndex("Title")); 
       String allTime = cursor.getString(cursor.getColumnIndex("Time")); 
       String allDate = cursor.getString(cursor.getColumnIndex("Date")); 

       if (adapter != null) { 
        adapter.add(iD, allTask, allTime, allDate); 
        listview.setAdapter(adapter); 
        adapter.getCount(); 
//     check(); 
       } 
      } 
     } else { 
     } 
    } 

AllAdapter

http://pastebin.com/qbLDtf4v

完成標籤

http://pastebin.com/WCCbZ0h4

CompleteAdapter

http://pastebin.com/QdbuTQKm

+0

如果您使用列表來顯示數據,請確保您在列表的適配器上調用notifyDataSetChanged(),以便使用新數據更新視圖。 –

+0

而不是將數據從一個表移動到另一個表,只創建一個任務列表,其布爾列表示完成與否。而切換隻是從表中更新該字段。你的代碼在哪裏? –

+0

@AmrutBidri請檢查 – Hoo

回答

3

Android documentation for fragment lifecycle

系統顯示片段onResume()onPause()將被稱爲只有當活動onResume()onPause()被調用。它們與活動緊密相連。

由於這個原因,您無法在標籤更改時刷新您的視圖。

要解決此問題,我在我的應用程序中找到了setUserVisibleHint 中的一個解決方案,因爲我們的要求相同。下面您片段的功能,並在您的片段代碼實現它Viewpager電話

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 

    // Make sure that we are currently visible 
    if (this.isVisible()) { 
     // If we are becoming invisible, then... 
     if (!isVisibleToUser) { 
      Log.d("TAG", "Stop animation and audio you are not visible"); 

     } 
    } 
} 

這就是文檔說什麼

設置的提示,系統對這個片段的UI是否是當前 對用戶可見。此提示默認爲true,並且跨片段實例狀態保存和恢復爲持久 。應用可能會將此設置爲 false,以指示片段的UI已滾動出可見性 或以其他方式不能直接顯示給用戶。系統可以使用此係統來優先執行操作,例如片段生命週期更新 或裝入器排序行爲。此方法可能會在 片段生命週期之外調用。因此對於 片段生命週期方法調用沒有訂單保證。

ViewPager在它的子片段上調用它。 欲瞭解更多信息,ViewPager也呼籲setMenuVisibility你可以使用它,如果你面臨的問題在顯示或刪除菜單。請參閱setMenuVisiblity documnet的鏈接,其中指出

設置該片段的菜單是否應該可見的提示。這是 如果您知道某個片段已放置在您的視圖 層次結構中,以便用戶目前無法看到它,那麼它應該也不會顯示任何菜單 。

4

默認情況下最接近的選項卡內ViewPager在同一時間加載。發生這種情況是因爲在使用切換按鈕進行任何切換之前,數據已加載到第二個選項卡。要解決問題,您必須在完成的選項卡中更新數據,以防數據發生變化。

這可以通過幾種方式實現:

  • 第一個片段應該發送的每一個變化和第二的事件對事件和更新數據應該訂閱手動

  • 使用裝載機&內容提供商(或只是自定義的URI)。裝載機訂閱任何URI更改,您的資料庫/ DAO數據庫助手通知該URI任何關於變化的(當插入/更新/刪除方法被調用)

context.getContentResolver().notifyChange(uri);

裝載機爲對象。

abstract class CachedLoader<T> extends AsyncTaskLoader<T> { 

@Nullable 
private T cachedData; 

CachedLoader(Context context) { 
    super(context); 
} 

void registerUri(Uri... observerUris) { 
    for (Uri uri:observerUris) { 
     getContext().getContentResolver().registerContentObserver(uri, true, createContentObserver()); 
    } 
} 

ContentObserver createContentObserver() { 
    return new ForceLoadContentObserver(); 
} 

@Override 
public void deliverResult(T data) { 
    super.deliverResult(data); 
    this.cachedData = data; 
} 

@Override 
public void onContentChanged() { 
    super.onContentChanged(); 
    cachedData = null; 
} 

@Override 
protected void onStartLoading() { 
    if (!takeContentChanged() && cachedData != null) { 
     deliverResult(cachedData); 
     return; 
    } 

    forceLoad(); 
} 

@Override 
protected void onReset() { 
    super.onReset(); 
    cachedData = null; 
} 
} 

通話記錄uri訂閱該uri更改。

或使用CursorLoader,因爲您直接使用光標進行操作。正如我在更新的問題看

我更喜歡第二種方法,但第一個是簡單的

+0

我沒有得到你:( – Hoo

3

所以我只是把下面的代碼我已完成任務片段

@Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if(isVisibleToUser){ 
      retrieveList(name);//call the method to be refreshed 
     } 
     else{ 
      //no 
     } 

    } 

充分利用@Swapnil提示和答案來自https://stackoverflow.com/a/40763755/5261462

3

把下面的代碼片段上onResumse這樣

@Override 
    public void onResume() { 

    super.onResume(); 
    retrieveList(name); 
    } 
3

你可以做的是創建一個界面沿線

public interface ReminderCompletedListener 
{ 
    void reminderCompleted(); 
} 

CompletedTask創建該偵聽器的一個實例並將其註冊到您的活動。

((MyActivity) getActivity()).setReminderCompletedListener(new ReminderCompletedListener() 
{ 
    @Override 
    public void reminderCompleted() 
    { 
     retrieveList(name); 
    } 
}); 

您的活動創建一個你可以從你撥動點擊監聽

((MyActivity) getActivity()).reminderCompleted(); 

調用方法將觸發完成列表刷新當你完成從你的提醒標籤的任務。從這個解決方案中取得的一個主要考慮是它直接將你的碎片與你的活動結合起來。

Theres對此的其他解決方案,你可以使用公共汽車(事件總線/ otto),也可能是rxjava,你可以探索那些如果你喜歡,但我給的香草解決方案應該做的很好。

相關問題