【发布时间】:2016-05-31 18:37:59
【问题描述】:
我的应用有两个可以插入到的表:联系人表和消息表。每个表都有一个与之链接的 ListView 适配器,其想法是,当将新条目插入任一表时,适配器将更新为 notifyDataSetChanged() 并显示在 ListView 中。我已经让它与联系人代码一起工作,但是当我对消息代码(如下所示)尝试同样的事情时,它会将条目插入表中,但不会更新 ListView。 ListView 仅在我卸载应用程序或升级 SQLite 数据库时更新。我已经实现了notifyDataSetChanged() 并尝试从onResume() 更新适配器和游标,但没有任何区别。我还检查了这些来源,除其他外,没有运气:
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...
}
}
下面是处理tab布局和ViewPager的Activity:
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;
}
}
}
【问题讨论】:
-
@Ahmad.Aslam90:感谢您的回答!我已经看过了,我已经尝试过更新
onResume()中的光标和适配器,并将List<Message> arrayOfMessages = dbHelper.getAllMessages();替换为arrayOfMessages.addAll(dbHelper.getAllMessages)(以及其他必要的更改),但没有运气。 -
您可以尝试使用 CursorAdapter 而不是 ArrayAdapter,因为您使用的是 SQLite
-
我会研究一下 CursorAdapter,谢谢!
标签: java android sqlite listview