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

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

王鹏飞
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添加和获取数据。

  • 这个问题可能已经得到了回答,我读过很多类似的,但对我不起作用。因此,我的具有扩展的自定义表模型。我的数据是和列名。那么,当我的数据发生更改时,如何更新表呢?我一直在使用,它正在工作,但它将我的自定义单元格呈现器重置为默认值。谢了。