【问题标题】:ListView not shown when adapter is set second time第二次设置适配器时未显示 ListView
【发布时间】:2014-11-25 23:45:13
【问题描述】:

我有 2 个不同的活动,我在其中进行了更改。但是当我去第二个活动并按回 ListView 时没有显示。我似乎找不到问题所在。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    currentLayout = R.layout.activity_main;
    db = new TodoDbHelper(this);
    todos = db.getAllTodos();
    nrOfTodos = todos.size();

    //For ListView
    mListView = (ListView) findViewById(R.id.gradientBackground);
    mAdapter = new TodoAdapter<String>(this, R.layout.text_view_item_default);
    mListView.setAdapter(mAdapter);

    //Calculate height of screen
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int width = size.x;
    int height = size.y;
    listItemSize = height/10;
    SCREEN_WIDTH = width;        

    createTodoItems();

}

public void createTodoItems() {
    refresh();
    mAdapter.clear();
    for(int i = 0; i < nrOfTodos; i++) {
        String title = todos.get(i).getTitle();

        mAdapter.add(title);
        //System.out.println(title);
        //System.out.println(mAdapter);

    }
    mListView.setAdapter(mAdapter);         
    ImageButton b = (ImageButton) findViewById(R.id.addButton);
    b.bringToFront();
}

public void refresh() {
    todos = db.getAllTodos();
    nrOfTodos = todos.size();
}

@Override
public void onBackPressed() {
    System.out.println("" + this.findViewById(android.R.id.content).getRootView());
    System.out.println("" + currentLayout);
    if(R.layout.activity_add_todo == currentLayout) {
        setContentView(R.layout.activity_main);
        currentLayout = R.layout.activity_main;

        createTodoItems();
        Log.d("onBackPressed", "We're going back.");
    }

}

我两次都执行相同的“createTodoItems()”,但第二次似乎并不重要。

在第二个 createTodoItems() 之后 mAdapter 似乎也是一样的。 mAdapter 中的值还是一样的。

添加新项目时同样的问题。它只是不会从 ListView 呈现任何内容。

【问题讨论】:

  • 这不是拥有 2 个活动并按后退按钮返回上一个活动的正确方法……您需要使用意图。
  • 这是因为 onBackPressed() 您正在重新设置 contentview 并执行 createTodoItems() 而无需像 onCreate() 那样再次重新设置 mListView 和 mAdapter - 我假设您正在覆盖 onBackPressed() 所以以免完成活动。
  • 是的,没错。现在我什至不知道我在做什么了。
  • @Clanket 如果你在活动 A 中有列表,然后你去活动 B 更新列表(在活动 A 中),那么你所要做的就是覆盖 onRestart() 或 onResume( ) 在活动 A 中,以在活动 B 关闭后刷新列表。或者你可以在Activity A中有一个静态刷新列表方法,并在Activity B的onDestroy()或onStop()中调用它。如果你可以发布这两个Activity的代码,我可以提供答案。 -- 我不知道你为什么要设置 contentview 两次相同的活动?
  • @wildroid 我实际上是在尝试用片段修复它,但我遇到了一些麻烦。那么两个屏幕应该是不同的片段吗?我尝试像link 一样修复它,其主要活动只是一个空的 FrameLayout 并使用事务/提交添加这些,但随后我需要设置主屏幕并从与我的 maintodofragment 相关的 XML 中获取 listView 但因为我的活动只是一个空的 frameLayout 它返回 null。

标签: android listview android-activity android-arrayadapter


【解决方案1】:

尝试添加这个函数notifyDataSetChanged(),可能有帮助:

public void createTodoItems() {
   refresh();
   mAdapter.clear();
   for(int i = 0; i < nrOfTodos; i++) {
      title = todos.get(i).getTitle();

      mAdapter.add(title);
      //System.out.println(title);
      //System.out.println(mAdapter);

   }
   mListView.setAdapter(mAdapter);  
   mAdapter.notifyDataSetChanged();   
   ImageButton b = (ImageButton) findViewById(R.id.addButton);
   b.bringToFront();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2016-06-22
    • 1970-01-01
    • 2019-06-05
    相关资源
    最近更新 更多