【问题标题】:Activity UI not refreshing after navigating up向上导航后活动 UI 不刷新
【发布时间】:2016-01-22 10:50:25
【问题描述】:

我有三个 Activity:MainActivity(带有 ListView)、SettingsActivity 和 NoteActivity(用于显示笔记)。 MainActivity 启动 SettingsActivity 或 NoteActivity。

当我在设置或 NoteActivity 中按返回(在手机的导航栏上)时,我会返回 MainActivity 并调用 listadapter.notifyDataSetChanged()。 Listview 刷新,一切正常。 当我按下(设置或 NoteActivity 工具栏中的后退箭头)时,会调用相同的方法,但 Listview 不会刷新。 这只会在我向上导航时发生,而不是在我向后导航时发生。

Manifest 中将 MainActivity 设置为父 Activity:

<activity
    android:name=".settings.SettingsActivity"
    android:parentActivityName=".MainActivity"
    android:label="@string/title_activity_settings" >
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="de.MainActivity" />
</activity>

其他 UI 元素(如 SwipeRefreshLayout)在向上导航后也无法正常工作。我使用调试器查看了行为的差异,但在这两种情况下都调用了相同的方法。

有人知道问题出在哪里吗?请告诉您是否需要更多代码。

//编辑:一些代码

我的MainActivity的相关代码:

public class MainActivity extends AppCompatActivity {
    private List<Note> notes;
    private ListView listView;
    private ArrayAdapter<Note> adapter;
    SwipeRefreshLayout srl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onClickFab(view);
            }
        });

        notes = NoteManager.Instance.getNotes(this);
        adapter = new NoteAdapter(this,notes);
        listView = (ListView)findViewById(R.id.listview);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                itemClickedAction(view, position, id);
            }
        });

        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                return itemLongClickedAction(view, position, id);
            }
        });

        srl = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
        srl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                startSync();
            }
        });

        this.startSync();
    }

    private void startSync(){
        Log.d(this.getClass().getName(), "Start Sync");
        NoteManager.Instance.sync();
    }


    public void syncFinished(){
        Log.d(this.getClass().getName(), "Sync finished");
        this.datasetChanged();
        if(srl.isRefreshing()) {
            srl.setRefreshing(false);
        }

    }

    public void datasetChanged(){
        Log.d(this.getClass().getName(), "DataSetChanged");
        adapter.notifyDataSetChanged();
    }

}

我的 NoteActivity 的 onDestroy 方法告诉 NoteManager 调用mainActivity.datasetChanged()。方法调用已记录,因此必须调用该方法。向后按时有效,向上按时无效。在这两种情况下,我都会看到日志。

SwipeRefresh 布局也是如此。调用startSyncsyncFinished-方法。但是尽管调用了srl.setRefreshing(false),加载动画并没有停止。这似乎是 UI 元素的问题。

--> 调用相同方法时的不同行为

【问题讨论】:

  • 也分享您的代码。
  • 你在哪里调用了 listadapter.notifyDataSetChanged()
  • 我添加了一些代码。 notifyDataSetChanged 在其他 Activity 被销毁(onDestroy)时被调用。

标签: java android listview swiperefreshlayout


【解决方案1】:

我的 NoteActivity 的 onDestroy-Method 告诉 NoteManager 调用 mainActivity.datasetChanged()。方法调用已记录,因此必须调用该方法。向后按时有效,向上按时无效。在这两种情况下,我都会看到日志。

尝试将mainActivity.datasetChanged() 改为onPause or onStop

最好用startActivityForResult 启动NoteActivity。

Android Documentation

【讨论】:

  • 感谢您的回答(我还不能投票)。那并没有解决问题。我认为这与调用方法的特定时间无关,例如。 SwipeRefreshLayout 的加载动画是从 MainActivity 调用的,当我在 MainActivity 中时,它会从 MainActivity 停止(srl.setRefreshing(false)),但它不会停止。只要我没有使用向上导航功能,它就可以工作。 notifyDataSetChanged() 也一样。
  • 我的猜测是,在向上导航时不会调用 onDestroy。你试过 startActivityForResult 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多