【发布时间】:2017-09-29 07:41:53
【问题描述】:
在横向模式下选择菜单选项项时,它似乎不起作用,它只有一个进度加载器,但在纵向模式下,我可以选择菜单项选项并执行预期任务,它会加载新的加载器并以网格视图。
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<List<MovieImageData>>{
private final String LOG_TAG = MainActivity.class.getSimpleName();
//API KEY
private static final String API_KEY = "";
private static final String BASE_SORT_URL = "http://api.themoviedb.org/3/movie";
//Popular movie query
private static final String POPULAR_MOVIES_TAG = "/popular?api_key=";
//Top rated movie query
private static final String TOP_RATED_MOVIES_TAG = "/top_rated?api_key=";
private static final String POPULAR_MOVIES_URL = BASE_SORT_URL + POPULAR_MOVIES_TAG + API_KEY;
private static final String TOP_RATED_MOVIES_URL = BASE_SORT_URL + TOP_RATED_MOVIES_TAG + API_KEY;
private static String currentURL = POPULAR_MOVIES_URL;
static boolean hasLoaderOne = false;
MoviePosterAdapter adapter;
GridView moviePosterGridView;
View progress;
private static ArrayList<MovieImageData> movieData;
//Movie base
private static final String MOVIEDB_BASE_URL = "http://api.themoviedb.org/3/movie";
//Image base URL
private static final String MOVIEDB_IMAGE_BASE = "http://image.tmdb.org/t/p/w185/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progress = findViewById(R.id.loading_spinner);
if(savedInstanceState == null || !savedInstanceState.containsKey("movie")) {
Log.i(LOG_TAG, "Ent======================================================================");
progress.setVisibility(View.GONE);
getLoaderManager().initLoader(0, null, this).forceLoad();
}else {
movieData = savedInstanceState.getParcelableArrayList("movie");
updateUi(movieData);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.settings, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.popular:
currentURL = POPULAR_MOVIES_URL;
getLoaderManager().getLoader(0).forceLoad();
progress.setVisibility(View.VISIBLE);
hasLoaderOne = false;
return true;
case R.id.top_rated:
currentURL = TOP_RATED_MOVIES_URL;
getLoaderManager().initLoader(1, null, this).forceLoad();
hasLoaderOne = true;
progress.setVisibility(View.VISIBLE);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putParcelableArrayList("movie", movieData);
super.onSaveInstanceState(outState);
}
@Override
public Loader<List<MovieImageData>> onCreateLoader(int id, Bundle args) {
Log.i(LOG_TAG, "LOADER============================");
progress.setVisibility(View.VISIBLE);
return new MovieImageLoader(MainActivity.this, currentURL);
}
@Override
public void onLoadFinished(Loader<List<MovieImageData>> loader, List<MovieImageData> data) {
progress.setVisibility(View.GONE);
movieData = new ArrayList<MovieImageData>();
movieData.addAll(data);
updateUi(movieData);
}
@Override
public void onLoaderReset(Loader<List<MovieImageData>> loader) {
progress.setVisibility(View.GONE);
moviePosterGridView.setAdapter(null);
}
public void updateUi(final List<MovieImageData> moviePosterData){
// Create a new {@link ArrayAdapter} of earthquakes
adapter = new MoviePosterAdapter(this, moviePosterData);
TextView noItemFound = (TextView) findViewById(R.id.no_list);
// Find a reference to the {@link ListView} in the layout
moviePosterGridView = (GridView) findViewById(R.id.gridview);
moviePosterGridView.setEmptyView(noItemFound);
if(!isOnline()){
noItemFound.setVisibility(View.VISIBLE);
}else{
//noItemFound.setText("No earthquakes found!");
}
// Set the adapter on the {@link ListView}
// so the list can be populated in the user interface
moviePosterGridView.setAdapter(adapter);
}
public boolean isOnline() {
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
}
在您将其旋转回纵向模式之前,正在进行的加载程序会继续并不会结束。
【问题讨论】:
-
你把它藏在哪里(进度)?这也是对加载器的完全滥用......你不应该调用
forceLoad(而不是initLoader/restartLoader)......你不应该将movieData存储在outState中(加载器应该在旋转时的活动破坏中幸存下来并再次调用initLoader应该调用onLoadFinished而不创建新实例) -
第一次调用第二个 Loader 我在 onOptionsItemSelected(MenuItem item) 中初始化了它。您认为实现这一目标的最佳方式是什么?
-
我认为当您更改设备的方向时,活动重新创建所需的值不会得到。尝试 android:configChanges="orientation|screenSize" 将此行放在 MainActivity 声明中的清单文件中。
-
我是这么认为的,但如何解决,为什么没有得到方向
-
尝试 android:configChanges="orientation|screenSize" 将此行放在 MainActivity 声明中的清单文件中。 Million Monkeys Programming Style的好例子
标签: java android listview asynctaskloader