[英]Adapter not Updating After SQLite Insertion
我的应用程序具有两个可以插入的表:“联系人”表和“消息”表。 每个表都有一个链接到它的ListView适配器,其想法是,当在其中一个表中插入新条目时,适配器将使用notifyDataSetChanged()
更新并显示在ListView中。 我已经将其与“联系人”代码一起使用,但是当我尝试与“消息”代码(如下所示)进行相同操作时,它会将条目插入表中,但不会更新ListView。 仅当我卸载应用程序或升级SQLite数据库时,ListView才会更新。 我已经实现notifyDataSetChanged()
并尝试从onResume()
更新适配器和游标,但是没有任何区别。 我还检查了以下来源,但没有运气:
Android-添加到SQLite数据库后不会更新ListView,除非重新启动应用程序
notifyDataSetChanged后,Android ListView不刷新
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的活动:
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;
}
}
}
实际上,您是在分页器适配器中而不是在列表视图适配器中应用notifyDataSetChanged,至少看起来是这样, 因此在listView适配器中应用notify DataSetChanged。 如果您在某个片段中定义了列表视图,而不是在片段中创建一个公共方法来更新数据集(您将在其中调用适配器的notifyDataSetChanged)并将在标签布局中使用的所有片段实例存储在一些稀疏数组中,您可以使用您的主要活动中的实例调用该片段的相应方法。 如果我错了,请发表评论,然后我将更新我的答案,因为我已经实现了类似的功能,并且我的代码运行良好。
因此,我感谢每个人的回答,但是当我终于能够恢复到该错误之后,事实证明服务器上的GCM实施存在问题。 一旦我注释掉了Android代码的GCM部分,该列表就会按预期进行更新。 我有点傻。 谢谢大家!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.