【问题标题】:Adapter not Updating After SQLite Insertion插入 SQLite 后适配器未更新
【发布时间】: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&lt;Message&gt; arrayOfMessages = dbHelper.getAllMessages(); 替换为 arrayOfMessages.addAll(dbHelper.getAllMessages)(以及其他必要的更改),但没有运气。
  • 您可以尝试使用 CursorAdapter 而不是 ArrayAdapter,因为您使用的是 SQLite
  • 我会研究一下 CursorAdapter,谢谢!

标签: java android sqlite listview


【解决方案1】:

在公共getView()中返回convertView

也检查这个链接

ViewPager PagerAdapter not updating the View

【讨论】:

  • 我应该说代码被截断了,所以查看器不必永远滚动(getView() 方法很长),我确实返回了 convertView。我还查看了该链接,这是非常好的信息,但我仍然无法让我的代码使用它。
【解决方案2】:

所以我很感谢大家的回答,但是在我终于能够回到这个错误之后,事实证明我在服务器上的 GCM 实现存在问题。一旦我注释掉了 Android 代码的 GCM 部分,列表就会按预期自行更新。我觉得有点傻。还是谢谢大家!

【讨论】:

    【解决方案3】:

    实际上,您是在分页适配器而不是列表视图适配器中应用 notifyDataSetChanged,至少看起来是这样,所以在 listView 适配器中应用 notifyDataSetChanged。 如果您在某个片段中定义了列表视图,而不是在片段中创建一个公共方法来更新数据集(您将在那里为适配器调用 notifyDataSetChanged)并将选项卡布局中使用的片段的所有实例存储在某个稀疏数组中,所以您可以使用您的主要活动中的实例调用片段的相应方法。 如果我错了,请发表评论,然后我会更新我的答案,因为我已经实现了类似的东西并且我的代码运行良好..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      相关资源
      最近更新 更多