当前位置: 首页 > 面试题库 >

适配器数据更改时如何更新可扩展列表视图

王鹏飞
2023-03-14
问题内容

我有一个扩展ExpandableListActivity的活动。我使用SimpleCursorTreeAdapter填充ExpandableListView。我的布局包含列表视图和空视图。在应用启动时,ExpandableListActivity自动选择要显示的右视图。

我的步骤:

  1. 应用启动,没有数据。(屏幕上的空白视图)
  2. 将一些数据插入db。
  3. 调用adapter.notifyDataSetChanged(); 但是屏幕上仍然没有空白视图,并且列表视图中没有任何项目。

然后我重新启动应用程序

  1. 出现列表视图。我展开所有组并滚动到底部。
  2. 我单击列表中的项目。出现新活动。
  3. 单击后退按钮。所有组均已折叠,我们位于屏幕顶部。滚动位置和展开的组不被记住。
  4. 从db中删除所有数据,然后调用adapter.notifyDataSetChanged();。
  5. 子视图已消失,但顶级组仍然可见。

问题:

  1. 如何用列表视图替换空视图?
  2. 如何保存组的状态和滚动列表视图的位置?

在SDK上测试:1.5r3、1.6r1

码:

public class MainActivity extends ExpandableListActivity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        dbHelper = new DBOpenHelper(this);

        rubricsDbAdapter = new RubricsDBAdapter(dbHelper);
        rubricsDbAdapter.open();

        itemsDbAdapter = new ItemsDBAdapter(dbHelper);
        itemsDbAdapter.open();

        rubricsCursor = rubricsDbAdapter.getAllItemsCursor();
        startManagingCursor(rubricsCursor);

        // Cache the ID column index
        rubricIdColumnIndex = rubricsCursor.getColumnIndexOrThrow(RubricsDBAdapter.KEY_ID);

        // Set up our adapter
        mAdapter = new MyExpandableListAdapter(rubricsCursor,
                this,
                android.R.layout.simple_expandable_list_item_1,
                android.R.layout.simple_expandable_list_item_1,
                new String[] {RubricsDBAdapter.KEY_NAME},
                new int[] {android.R.id.text1},
                new String[] {ItemsDBAdapter.KEY_NAME}, 
                new int[] {android.R.id.text1});

        setListAdapter(mAdapter);
    }

    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
        Intent i = new Intent(this, ItemViewActivity.class);
        i.putExtra(ItemsDBAdapter.KEY_ID, id);
        startActivity(i);

        return super.onChildClick(parent, v, groupPosition, childPosition, id);
    }

    private void updateMyData() {
        int i;
        int k;
        long rubricId;

        for (i = 1; i <= 5; i++) {
            rubricId = rubricsDbAdapter.insert("rubric " + i);
            for (k = 1; k <= 5; k++) {
                itemsDbAdapter.insert("item " + i + "-" + k, rubricId);
            }
        }

        mAdapter.notifyDataSetChanged();
    }

    private void deleteMyData() {
        rubricsDbAdapter.deleteAll();
        itemsDbAdapter.deleteAll();

        mAdapter.notifyDataSetChanged();
    }

    public class MyExpandableListAdapter extends SimpleCursorTreeAdapter 
    {
        public MyExpandableListAdapter(Cursor cursor, Context context, int groupLayout,
                int childLayout, String[] groupFrom, int[] groupTo, String[] childrenFrom,
                int[] childrenTo) {
            super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childrenFrom,
                    childrenTo);
        }

        @Override
        protected Cursor getChildrenCursor(Cursor notebookCursor) {
            // Given the group, we return a cursor for all the children within that group 
            long id = notebookCursor.getLong(rubricIdColumnIndex);

            Cursor itemsCursor = itemsDbAdapter.getRubricItemsCursor(id);
            startManagingCursor(itemsCursor);
            return itemsCursor;
        }

    }
}

问题答案:

因此,答案是:

  1. 在调用适配器的notifyDataSetChanged()方法之前,先调用cursor.requery()。
  2. 在活动的onPause()方法中保存组状态,并在onResume()方法中恢复。


 类似资料:
  • > 从创建的片段中更新,将新数据设置为adapter,然后调用;但没有奏效。 像其他人一样创建一个新适配器,它对他们起作用,但对我没有任何改变: 在中创建一个更新数据的方法,如下所示: 问题是gridView的布局如下所示: 然后我只是删除了并将作为父布局。

  • 试图弄清楚更新的适配器有什么问题。 在我得到一个新的产品列表后,我尝试: > 从创建的片段中更新,将新数据设置到adapter,然后调用;但没有奏效。 像其他人一样创建一个新适配器,它对他们有效,但对我没有任何改变: 在中创建一个更新数据的方法,如下所示: 然后每当我想要更新数据列表时,我就调用这个方法;但没有奏效。 检查是否可以以任何方式修改recyclerView,并且我尝试至少删除一个项目:

  • 我再次发布这个,试图使问题/问题更清楚: 到目前为止,代码填充了ArrayList项目,创建了一个适配器并将项目添加到其中,然后在ListView lv中显示它。到目前为止,一切都很好。 但是,getShoppingList()方法会运行多次,更新ArrayList项。而不是每次发生这种情况时都重新创建适配器,我只想更新它并在ListView lv中显示更新的内容。 我想说的是: “更新”按钮的O

  • 问题内容: 关于扩展django管理模板的一个(不是这样)快速问题。 我试图通过在结果行(row1和row2类)之间添加一个包含一些与该对象相关的对象的中间行来更改特定模型的结果列表(在django lingo中更改列表)。 我搜索了代码,但没有找到一种方法来执行此操作。非常感谢任何指针。代码也将有所帮助。 PS:我知道我应该设计自己的界面,但这是一个内部项目,我没有太多时间可以花时间。另外,dj

  • 我正在创建聊天应用程序,我想每秒刷新一次数据,但问题是recyclerview scroll重置了它们的第一个位置。如何摆脱这个。提前感谢:) 我使用MySql sserver添加和获取数据。

  • 我想确定回收站视图中最明显的项目,因此我使用以下方法: 它工作得很好,但是在我更改数据集,并在我的适配器中调用任何方法后,如果我尝试使用上述函数,则和返回的项目位置是错误的。 我注意到他们都在幕后使用getlayoutposition,我还注意到在文档上写着: 听起来好像正是我正在寻找的,但我不知道如何从中访问它。 有什么想法吗? 谢谢你。