2016-05-31 96 views
0

我的應用程序有兩個表可以插入到:Contacts表和Messages表。每個表都有一個鏈接到它的ListView適配器,並且想法是當一個新條目插入到任一表中時,適配器將使用notifyDataSetChanged()進行更新,並且將顯示在ListView中。我已經將它與聯繫人代碼一起使用,但是當我使用Messages代碼(如下所示)嘗試同樣的事情時,它會將條目插入表中,但不會更新ListView。當我卸載應用程序或升級SQLite數據庫時,ListView只會更新。我有notifyDataSetChanged()實施並嘗試更新從onResume()適配器和光標,但它沒有任何區別。我還檢查了這些資源,除其他外,並沒有運氣:適配器SQLite插入後不更新

Android - ListView not being updated after adding to SQLite database unless app is restarted

Android ListView not refreshing after notifyDataSetChanged

onPostExecute()是獲取數據和更新適配器:

// Saves all data received into a cursor, which is then saved to the 
// List<Message> object 
List<Message> arrayOfMessages = dbHelper.getAllMessages(); 

dbHelper.close(); 

final MessagesAdapter adapter = new MessagesAdapter(getContext(), arrayOfMessages); 

ListView listView = (ListView) getActivity().findViewById(R.id.messages_listview); 
listView.setAdapter(adapter); 

fragmentsPagerAdapter.notifyDataSetChanged(); 

swipeRefreshLayout.setRefreshing(false); 

消息適配器類

public class MessagesAdapter extends ArrayAdapter<Message> { 

    public MessagesAdapter(Context context, List<Message> messages) { 
     super(context, 0, messages); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     // Get the data item for this position 
     Message message = getItem(position); 

     // Get rest of convertView... 
    } 
} 

下面是處理的標籤佈局和ViewPager活動:在公共getView

public class WhoopNavigationActivity extends AppCompatActivity 
    implements FeedFragment.OnFragmentInteractionListener, NetworkFragment.OnFragmentInteractionListener, 
    ProfileFragment.OnFragmentInteractionListener, NetworkNewModal.NetworkNewModalListener { 

    SaveStateParams saveStateParams = new SaveStateParams(); 
    ServerPost serverPost = new ServerPost(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_whoop_navigation); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     final FragmentsPagerAdapter fragmentsPagerAdapter = new FragmentsPagerAdapter(getSupportFragmentManager()); 

     // Set up the ViewPager with the sections adapter. 
     final ViewPager mViewPager = (ViewPager) findViewById(R.id.container); 
     mViewPager.setAdapter(fragmentsPagerAdapter); 

     // View of activity 
     View view = findViewById(android.R.id.content); 

     TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 

     tabLayout.setupWithViewPager(mViewPager); 
    } 

    public static class FragmentsPagerAdapter extends FragmentStatePagerAdapter { 

     // Constructor 
     public FragmentsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch(position) { 
       case 0: 
        return FeedFragment.newInstance(); 
       case 1: 
        return NetworkFragment.newInstance(); 
       case 2: 
        return ProfileFragment.newInstance(); 
      } 
      return null; 
     } 

     @Override 
     public int getCount() { 
      // Show 3 total pages. 
      return 3; 
     } 

     public int getItemPosition(Object item) { 
      // Causes adapter to reload all Fragments when notifyDataSetChanged is called 
      return POSITION_NONE; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 0: 
        return "Feed"; 
       case 1: 
        return "Network"; 
       case 2: 
        return "Profile"; 
      } 
      return null; 
     } 

    } 
} 
+0

檢查這個答案http://stackoverflow.com/questions/14503006/android-listview-not-refreshing-after-notifydatasetchanged?lq=1 –

+0

@ Ahmad.Aslam90:謝謝你的答案!我已經看過了,我已經嘗試在'onResume()'中更新遊標和適配器,並用'arrayOfMessages.addAll(dbHelper.getAllMessages)'替換'List arrayOfMessages = dbHelper.getAllMessages();' (以及其他必要的變化),但沒有運氣。 – jexx04

+0

你可以嘗試一個CursorAdapter而不是ArrayAdapter,因爲你正在使用SQLite –

回答

0

所以我很感謝大家的回答,但是我終於能夠回到這個錯誤,事實證明,我的GCM在服務器上的實現存在問題。一旦我評論了Android代碼的GCM部分,該列表就會按預期更新自己。我感覺有點傻。無論如何你們都謝謝!

0

回報convertView()

檢查這個環節也

ViewPager PagerAdapter not updating the View

+0

我應該說,代碼是截斷的,所以查看器不必永遠滾動('getView()'方法很長),並且我返回convertView。我也檢查了這個鏈接,這是非常好的信息,但我仍然無法讓我的代碼與它一起工作。 – jexx04

0

其實你在申請notifyDataSetChanged尋呼機適配器,而不是在列表視圖適配器,至少這是它看起來,因此適用通知ListView適配器中的DataSetChanged。 如果您在片段中定義了列表視圖,而不是在片段中創建一個公共方法來更新數據集(您將在那裏爲適配器調用notifyDataSetChanged),並將標籤佈局中使用的所有片段實例存儲在一些稀疏數組,以便您可以使用來自您主要活動的實例調用碎片的相應方法。 如果我錯了他們請評論然後我會更新我的答案,因爲我已經實現了這樣的事情,我的代碼工作很好..