- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在加载一个 RecyclerView
,它基于对 Retrofit
的调用和存储在本地 SQLite
数据库中的数据。
在屏幕旋转时,RecyclerView
不断重置。此外,当我 Collection 一部电影(将电影添加到我的本地房间数据库)时,有时我的微调器与要填充到 RecyclerView
中的数据不对齐。下面是我的代码:
public class MainActivity extends AppCompatActivity {
private RecyclerView mMovieResults;
private MyAdapter mMovieResultsAdapter;
private String query;
private String mBaseURL;
private int lastFirstVisiblePosition;
//TODO: How is someone able to load my API Key if I am storing it
private ArrayList<String> mMovieURLS;
private ArrayList<Movie> mMovies;
private List<Movie> mMovieResultsList;
private static final String SPINNER_SELECTION = "SPINNER_SELECTION";
private boolean mIsFavoriteSelected;
private AppDatabase mDb;
private Spinner mSpinner;
private SharedPreferences mPrefs;
private SharedPreferences.Editor mPrefsEditor;
private static Bundle mBundleRecyclerViewState;
private int saved_selection = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v("ONCREATE", "ONCREATE");
if (savedInstanceState != null){
saved_selection = savedInstanceState.getInt(SPINNER_SELECTION);
}
if (isOnline()) {
setContentView(R.layout.activity_main);
Stetho.initializeWithDefaults(this);
mDb = AppDatabase.getInstance(getApplicationContext());
mMovieResults = findViewById(R.id.main_recyclerview_image_results);
GridLayoutManager glm = new GridLayoutManager(this, 3);
glm.setOrientation(LinearLayoutManager.VERTICAL);
mMovieResults.setLayoutManager(glm);
mMovieURLS = new ArrayList<>();
mMovies = new ArrayList<>();
mMovieResultsList = new ArrayList<>();
mMovieResultsAdapter = new MyAdapter(mMovieResultsList);
mMovieResults.setAdapter(mMovieResultsAdapter);
mDb = AppDatabase.getInstance(getApplicationContext());
mPrefs = getSharedPreferences("prefs", MODE_PRIVATE);
mPrefsEditor = mPrefs.edit();
switch (saved_selection){
case 0:
mBaseURL = "https://api.themoviedb.org/3/movie/popular/";
calltoRetrofit(mBaseURL);
break;
case 1:
mBaseURL = "https://api.themoviedb.org/3/movie/top_rated/";
calltoRetrofit(mBaseURL);
break;
case 2:
mIsFavoriteSelected = true;
mMovieURLS.clear();
retrieveMovies();
break;
default:
mBaseURL = "https://api.themoviedb.org/3/movie/popular/";
break;
}
} else {
setContentView(R.layout.activity_no_internet);
return;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.action_bar_spinner, menu);
MenuItem item = menu.findItem(R.id.spinner);
mSpinner = (Spinner) item.getActionView();
if (isOnline()) {
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.spiner_list_item_array, R.layout.custom_spinner);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSpinner.setAdapter(adapter);
if (saved_selection >= 0){
mSpinner.setSelection(saved_selection);
}
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
mPrefsEditor.putInt(SPINNER_SELECTION, i);
mPrefsEditor.commit();
switch (i) {
case 0:
mBaseURL = "https://api.themoviedb.org/3/movie/popular/";
calltoRetrofit(mBaseURL);
break;
case 1:
mBaseURL = "https://api.themoviedb.org/3/movie/top_rated/";
calltoRetrofit(mBaseURL);
break;
case 2:
mIsFavoriteSelected = true;
mMovieURLS.clear();
retrieveMovies();
break;
default:
mBaseURL = "https://api.themoviedb.org/3/movie/popular/";
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
return true;
} else {
return true;
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt(SPINNER_SELECTION, mSpinner.getSelectedItemPosition());
super.onSaveInstanceState(outState);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
int x = item.getItemId();
Log.v("OPTIONS_ID", String.valueOf(x));
return true;
}
private void retrieveMovies() {
//TODO: I am unsure if I am handling correctly. When I favorite and unfavorite a movie, and then go back to the MainActivity, it is not displaying the correct item from the Spinner.
//TODO: For example, favorites may be listed in the Spinner, however the screen may be displaying "TOP"
//TODO: How could I tell if I am making unnecessary queries to Room? I know it is a project requirement, but I was not sure how to handle if I am making unnecessary calls
//TODO: on screen rotation
MainViewModel viewModel = ViewModelProviders.of(this).get(MainViewModel.class);
final LiveData<List<Movie>> movies = viewModel.getMovies();
movies.observe(this, new Observer<List<Movie>>() {
@Override
public void onChanged(@Nullable final List<Movie> movies) {
for (Movie movie : movies) {
String photoURL = "http://image.tmdb.org/t/p/w185" + movie.getPoster_path();
Log.v("FAVORITE_URL", photoURL);
mMovieURLS.add(photoURL);
}
runOnUiThread(new Runnable() {
@Override
public void run() {
mMovieResultsList = movies;
mMovieResultsAdapter.notifyDataSetChanged();
}
});
}
});
}
@Override
protected void onResume() {
super.onResume();
((GridLayoutManager) mMovieResults.getLayoutManager()).scrollToPositionWithOffset(lastFirstVisiblePosition,0);
}
private void calltoRetrofit(String mBaseURL) {
mMovieURLS.clear();
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
OkHttpClient client = new OkHttpClient
.Builder()
.addInterceptor(interceptor)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(mBaseURL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
final ApiInterface apiInterface = retrofit.create(ApiInterface.class);
Log.v("API", API_KEY);
Call<Movies> call = apiInterface.getImages(API_KEY);
call.enqueue(new Callback<Movies>() {
@Override
public void onResponse(Call<Movies> call, Response<Movies> response) {
Log.v("RESPONSE", response.body().toString());
String totalPages = String.valueOf(response.body().getTotal_pages());
Log.v("TOTAL", totalPages);
mMovieResultsList = response.body().getResults();
for (Movie movie : mMovieResultsList) {
if (movie.getPoster_path() != null) {
String photoURL = "http://image.tmdb.org/t/p/w185" + movie.getPoster_path();
mMovieURLS.add(photoURL);
}
mMovieResultsAdapter.notifyDataSetChanged();
}
}
@Override
public void onFailure(Call<Movies> call, Throwable t) {
Log.v("FAILURE", t.toString());
}
});
}
@Override
public void onPointerCaptureChanged(boolean hasCapture) {
}
@Override
protected void onPause() {
super.onPause();
lastFirstVisiblePosition = ((GridLayoutManager)mMovieResults.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
public class ViewHolder extends RecyclerView.ViewHolder {
protected ImageView mResultImage;
public ViewHolder(View itemView) {
super(itemView);
mResultImage = itemView.findViewById(R.id.movie_poster_image);
}
}
public MyAdapter(List<Movie> mDataset) {
mMovieResultsList = mDataset;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.movie_poster_image, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
final String urlForPhoto = "http://image.tmdb.org/t/p/w185" + mMovieResultsList.get(position).getPoster_path();
Picasso.get()
.load(urlForPhoto)
.into(holder.mResultImage);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(getApplicationContext(), IndividualMovieActivity.class);
i.putExtra("Movie", mMovieResultsList.get(position));
startActivity(i);
}
});
}
@Override
public int getItemCount() {
return mMovieResultsList.size();
}
}
public interface ApiInterface {
@GET("?language=en-US")
Call<Movies> getImages(@Query("api_key") String api_key);
}
private boolean isOnline() {
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
最佳答案
RecyclerView 只会保存它向上滚动的位置,直到您调用 setAdapter
。通过在您仍然没有数据时调用 setAdapter
,滚动位置将被丢弃(如果没有位置 4,则无法滚动到位置 4)。
你应该等到你有数据调用setAdapter
。
关于java - 无法在屏幕旋转时保持 RecyclerView 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51393115/
我正在尝试获取从过去的 startposition/location 到当前移动的 currentposition/location 的距离(以米为单位)。 我确实有工作正常的currentposit
所以我有一堆绝对覆盖的 div。用户通过在叠加层上拖动来创建方形 div。如果您要创建一个 div,然后放大和缩小,div 会保持在同一位置,因为它对叠加层是绝对的,如前所述。 然而问题就出在这里。您
我想找到 View 在显示屏幕上的位置。 为此,我使用了 view.getLeft() 、view.getBottom() 、view.getRight() 等方法> , view.getTop()。
我有一个看起来像这样的 View 层次结构(基于其他答案和 Apple 的使用 UIScrollView 的高级 AutoLayout 指南): ScrollView 所需的2 个步骤是: 为 Scr
所以我有一个名为 MARKS 的表,我有这些列 STUDENT_ID, CLASSFORM_NAME, ACADEMIC_YEAR, TERM, SUBJECT_NAME, TOTAL_MARKS
我有一个问题我无法理解,请帮助: 我开发了带有图像的 html 页面,并使用 jQuery UI 帮助使它们可拖动,我将这些图像位置设置为相对位置并给出了左侧和顶部像素,这是页面的链接 http://
我正在尝试创建一个 CSS 动画,它在 sprite 表中循环播放 16 个图像,给人一种幽灵“漂浮”的错觉。动画通过在 background-position 位置之间移动以显示不同状态的幽灵来实现
我正在创建这个网站的 WebView https://nearxt.com/打开时询问位置但是当我使用此链接在 flutter 中创建 webview 时那么它就无法定位我还在应用程序中定义了位置,但
我正在以编程方式创建一个需要跨越 2 个屏幕的窗口。正在创建的窗口的大小是正确的,但窗口大约从第一个屏幕的一半开始。我可以将它拖回第一个屏幕的开头,NSWindow 非常适合。 我只需要知道在窗口的起
位置“/”的匹配叶路由没有元素。这意味着默认情况下它将呈现一个空值,从而导致一个“空”页面 //App.js File import { BrowserRouter as Router, Routes
我有一个运行 Ubuntu 和 Apache 的 VPS 例如,假设地址是:5.5.5.5 在 VPS 上,我有一个名为 eggdrop 的用户(除了我的 root 用户)。 用户 eggdrop 有
我有一个 JLabel与 ImageIcon ,我使用 setIcon() JLabel中的函数. ImageIcon然后上来,坐在我的JLabel 的文字左侧.是否有可能拥有 ImageIcon在文
我的图中有节点,它们的 xlabels 位于它们的左上方。我怎样才能改变这个位置?我希望 xlabels 正好位于节点本身的旁边。 最佳答案 xlp是你想要的属性,但它没有做任何事情。 你不能改变位置
我对基本的 VIM 功能有疑问:(我尝试谷歌搜索但找不到答案) 如何列出所有自定义功能。(我做了 :function 并且不能找到我的自定义函数) 如何获得自定义函数列表中的函数(或它们的存储位置)。
我是 PHP 的新手,虽然我一直在搜索,但我不知道该怎么做。 我知道可以使用 Location("some page") 进行重定向。我还读到,只要没有向用户显示任何内容,它就可以工作。 我想做的是:
如果在 jgrowl.css 中位置更改为“center”,我如何将其覆盖为默认值,即“top-right” $.jGrowl(data, { header: 'data', an
我需要根据用户是否滑动屏幕顶部、屏幕中间或屏幕底部来触发不同的事件。我正在尝试找出最好/最简单的方法来做到这一点,因为我很确定没有办法从 UISwipeGestureRecognizer 获取位置。
我需要枚举用delphi编写的外部应用程序中使用的类 ,因此我需要访问VMT表以获取该信息,但是我找不到任何有关如何在exe(由delphi生成)文件中找到VMT(虚拟方法表)的位置(地址)的文档。
在 D2010 (unicode) 中是否有像 Pos 这样不区分大小写的类似函数? 我知道我可以使用 Pos(AnsiUpperCase(FindString), AnsiUpperCase(Sou
我正在尝试为我的reveal.js 演示文稿制作一个标题,该标题会粘贴在屏幕顶部。标题中的内容在每张幻灯片的基础上都是动态的,因此我必须将标记放在 section 标记中。 显然,如果标记在 sect
我是一名优秀的程序员,十分优秀!