Общие настройки не сохранят и не загрузят данные - PullRequest
0 голосов
/ 07 декабря 2018

Вот код MainActivity

public class NewsActivity extends AppCompatActivity
    implements LoaderManager.LoaderCallbacks<List<News>>,
    SharedPreferences.OnSharedPreferenceChangeListener {

SwipeRefreshLayout mSwipeRefreshLayout;

private static final String LOG_TAG = NewsActivity.class.getName();

private static final String NEWS_REQUEST_URL =
        "https://newsapi.org/v1/articles;

private static final int NEWS_LOADER_ID = 1;

private NewsAdapter mAdapter;

private TextView mEmptyStateTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_news);

    mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeToRefresh);

    ListView newsListView = (ListView) findViewById(R.id.list);

    mEmptyStateTextView = (TextView) findViewById(R.id.empty_view);
    newsListView.setEmptyView(mEmptyStateTextView);

    mAdapter = new NewsAdapter(this, new ArrayList<News>());

    newsListView.setAdapter(mAdapter);

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

    prefs.registerOnSharedPreferenceChangeListener(this);

    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            mSwipeRefreshLayout.setRefreshing(false);
        }
    });


    newsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {

            News currentNews = mAdapter.getItem(position);


            Uri newsUri = Uri.parse(currentNews.getUrl());


            Intent websiteIntent = new Intent(Intent.ACTION_VIEW, newsUri);


            startActivity(websiteIntent);
        }
    });


    ConnectivityManager connMgr = (ConnectivityManager)
            getSystemService(Context.CONNECTIVITY_SERVICE);


    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();


    if (networkInfo != null && networkInfo.isConnected()) {

        LoaderManager loaderManager = getLoaderManager();

        loaderManager.initLoader(NEWS_LOADER_ID, null, this);
    } else {

        View loadingIndicator = findViewById(R.id.loading_indicator);
        loadingIndicator.setVisibility(View.GONE);

        mEmptyStateTextView.setText(R.string.no_internet_connection);
    }

}


public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    if (key.equals(getString(R.string.settings_webtitle_default))) {
        mAdapter.clear();

        mEmptyStateTextView.setVisibility(View.GONE);

        View loadingIndicator = findViewById(R.id.loading_indicator);
        loadingIndicator.setVisibility(View.VISIBLE);

        getLoaderManager().restartLoader(NEWS_LOADER_ID, null, this);
    }
}

@Override
public Loader<List<News>> onCreateLoader(int id, Bundle args) {
    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    String webTitle = sharedPrefs.getString(
            getString(R.string.webtitle),
            getString(R.string.settings_webtitle_key));
    String webImage = sharedPrefs.getString(
            getString( R.string.query_webimage ),
            getString( R.string.settings_webimage_key ));


    Uri baseUri = Uri.parse(NEWS_REQUEST_URL);
    Uri.Builder uriBuilder = baseUri.buildUpon();

    uriBuilder.appendQueryParameter("format", "json");
    uriBuilder.appendQueryParameter("limit", "10");
    uriBuilder.appendQueryParameter("webtitLe", webTitle);
    uriBuilder.appendQueryParameter( "webimage", webImage);

    return new NewsLoader(this, uriBuilder.toString());

}


@Override
public void onLoadFinished(Loader<List<News>> loader, List<News> news) {

    View loadingIndicator = findViewById( R.id.loading_indicator );
    loadingIndicator.setVisibility( View.GONE );

    mEmptyStateTextView.setText( R.string.no_news );

    mAdapter.clear();
    mAdapter.addAll(news);
}

@Override
public void onLoaderReset(Loader<List<News>> loader) {

    mAdapter.clear();
}


}

Теперь общие настройки не работают.Я хочу, чтобы приложение сохраняло данные локально и отображало их, даже когда нет подключения к Интернету.Я также использую NewsAdapter и NewsLoader.

Мне нужна помощь с локальным сохранением данных.Когда нет подключения к Интернету, я получаю свое собственное уведомление «R.string.no_internet_connection», но я бы предпочел загружать новости, которые уже показывались ранее.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

В дополнение к ответу @zokistone,

Существует два способа записи с использованием общих настроек:

1) commit () записывает данные синхронно (блокируя поток, который он вызываетот).Затем он информирует вас об успешности операции.

2) apply () планирует запись данных асинхронно.Он не информирует вас об успешности операции

 SharedPreferences sharedPref = pref.getSharedPreferences("newsdata", Context.MODE_PRIVATE);

                    SharedPreferences.Editor editor = sharedPref.edit();
                    editor.putString( "savedWebTitle", webTitle );
                    editor.putString( "savedWebUrl", webUrl );
                    editor.putString( "savedWebImage", webImage );

                    editor.apply(); or editor.commit();
0 голосов
/ 08 декабря 2018

Я сделал это с SharedPreferences:

 Context pref = null;
            SharedPreferences sharedPref = pref.getSharedPreferences("newsdata", Context.MODE_PRIVATE);

            SharedPreferences.Editor editor = sharedPref.edit();
            editor.putString( "savedWebTitle", webTitle );
            editor.putString( "savedWebUrl", webUrl );
            editor.putString( "savedWebImage", webImage );
            editor.apply();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...