2016-05-31 87 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),并将标签布局中使用的所有片段实例存储在一些稀疏数组,以便您可以使用来自您主要活动的实例调用碎片的相应方法。 如果我错了他们请评论然后我会更新我的答案,因为我已经实现了这样的事情,我的代码工作很好..