Android ViewSwitcher loadUrl 中的 WebView 加载一次

Android WebView in a ViewSwitcher loadUrl loads once

我的 ViewSwitcher 中有一个 ListView 和一个 WebView。在我的 ListView 适配器中,我有一个 onclick 侦听器,它将列表中单击的 url 写入 sharedpreferences。我正在尝试使用 onSharedPreferencesChangedListener 将 url 加载到 WebView 中。

这是我的适配器中的代码:

convertView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        viewSwitcher.showNext();
        Settings.writeSettings(context, "webviewUrl",
                urls.get(position));
    }
});
return convertView;

并且在首选项侦听器中:

@Override
public void onSharedPreferenceChanged(SharedPreferences pref, String key) {
    if (key.equals("webviewUrl")) {
        Log.d("TAG", pref.getString(key, null));
        WebView wv = (WebView) findViewById(R.id.rss_webview);
        wv.getSettings().setJavaScriptEnabled(true);
        wv.setWebViewClient(new MyWebViewClient());
        wv.loadUrl("about:blank");
        wv.loadUrl(pref.getString(key, null));
    }
}

这很好用,只是它只能用一次。首选项侦听器代码记录了正确的 urls,代码每次都执行,但 wv.loadUrl() 方法在第一次成功调用后似乎什么也没做。任何人都可以向我解释为什么会发生这种情况并可能提供解决方案吗?谢谢。

我通过在 WebView 上实现一个静态 ViewHolder 解决了这个问题,我需要保留比其视图生命周期更长的引用。

private static final class WebViewHolder {
    WebView wv;
}

@Override
public void onSharedPreferenceChanged(SharedPreferences pref, String key) {
    WebViewHolder holder = new WebViewHolder();
    if (key.equals("webviewUrl")) {
        if (wv == null) {
            wv = new WebView(this);
            holder.wv = (WebView) findViewById(R.id.rss_webview);
            holder.wv.getSettings().setJavaScriptEnabled(true);
            holder.wv.setWebViewClient(new MyWebViewClient());
            wv.setTag(holder);
        } else {
            holder = (WebViewHolder) wv.getTag(); 
        }
        holder.wv.loadUrl("about:blank");
        holder.wv.loadUrl(pref.getString(key, null));
    }
}