【问题标题】:Android ListView refresh issueAndroid ListView 刷新问题
【发布时间】:2010-10-24 16:40:56
【问题描述】:

我在刷新我的ListView 时遇到了一个奇怪的问题,它可以正常工作,直到设备旋转,然后再次刷新时它完全空白。这只能通过再次旋转设备来解决(因为它也在onCreate() 中刷新)但是每当它再次刷新时它就会变成空白。问题一直存在,直到应用重新启动。

编辑:

一些代码:

private ListView contactlist = null;
private static MatrixCursor matrixcursor = null;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    contactlist = (ListView) findViewById(R.id.contactlist);
    if (savedInstanceState == null) {
        matrixcursor = new MatrixCursor(new String[] {"_id","name","one","two","three","four"});
    } else {
        contactlist.setAdapter(new listCursorAdapter(this,matrixcursor));
    }
}

这可以正常工作,但无论何时:

contactlist.setAdapter(new listCursorAdapter(this,matrixcursor));

onCreate() 之后调用,并且在设备旋转之后ListView 变为空白。

【问题讨论】:

  • 你能发布一些代码吗?否则真的很难诊断问题。
  • 已经发布了一些代码。不想把所有东西都放上去,因为那会是 ~1000 行,但我想我得到了所有相关的东西
  • 您是否检查了用于横向视图的布局?也许里面有什么不对劲的地方。
  • 如果设备旋转横向纵向加上 onCreate() 中的 contactist.setadapter 行工作正常,也会出现问题,它在 oncreate 之后仅在其他函数中调用 contactlist.setadapter 会导致联系人列表变为空白.
  • 你是在手机上还是在模拟器上试过这个,我前段时间遇到过类似的问题,它发生在模拟器上,但在我工作的 4 部测试手机上都没有。跨度>

标签: android android-listview refresh


【解决方案1】:

我认为你的 MatrixCursor 实际上是空的。当您旋转手机时,您知道活动已被破坏。所以 savedinstanceState 包可能不为空,但 M​​atixCursor 不会重新初始化。是的,它是静态的,但我有一种感觉,如果它有可能没有加载到同一个类加载器中……那么静态不会太可靠。

有一个方法名字最别扭:

onRetainNonConfigurationInstance()

我认为这将帮助您解决此案。因此,如果您在那里返回您的 MatrixCursor 实例,您可以在稍后调用 onCreate() 时使用 getLastNonConfigurationInstance() 来读取数据。它不能保证被调用,因此您仍然需要处理没有存储状态的情况。希望这会有所帮助。

private ListView contactlist = null;
private MatrixCursor matrixcursor = null;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    contactlist = (ListView) findViewById(R.id.contactlist);
    matrixcursor = (MatrixCursor)getLastNonConfigurationInstance();
    if (matrixcursor == null) {
        matrixcursor = new MatrixCursor(new String[] {"_id","name","one","two","three","four"});
    } else {
        contactlist.setAdapter(new listCursorAdapter(this,matrixcursor));
    }
}

public MatrixCursor onRetainNonConfigurationInstance() {
return matrixcuror;
}

public MatrixCuror getLastNonConfigurationInstance() {
return (MatrixCursor) super.getLastNonConfigurationInstance();
}

【讨论】:

  • 谢谢,但它仍然无法正常工作。我还尝试添加 matrixcursor = (MatrixCursor)getLastNonConfigurationInstance();在contactlist.setAdapter(new listCursorAdapter(this,matrixcursor))之前;每当它在 onCreate() 之后被调用但仍然有同样的问题
【解决方案2】:

我设法通过将contactlist 设为静态来修复它:

 private static ListView contactlist = null;

我不知道为什么会这样(只是试错了几个小时)所以如果有人能解释一下那就太好了。

【讨论】:

    猜你喜欢
    • 2012-06-20
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多