это исключение nullpointerexception произошло, когда я выполняю поиск по запросу searchView, здесь указан код, но я не вижу ничего подходящего
private Context context = this;
private Toolbar toolbar;
RectF f;
private TextView title;
private ActionBar actionBar;
private RecyclerView searchRecyclerView;
private SearchView searchView;
private ImageView closeIcon;
private MovieAdapter adapter;
private MovieSearchPresenter presenter;
private int visibleItems, totalItem, currentItemPosition, totalPagesCount;
private boolean isLoading = false;
private RotateLoading loading;
private SwipeRefreshLayout refreshLayout;
private Handler handler;
private TextView searchText;
private LinearLayout noDataContainer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
toolbar = findViewById(R.id.toolbar);
title = toolbar.findViewById(R.id.title);
searchView = toolbar.findViewById(R.id.search_view);
searchRecyclerView = findViewById(R.id.search_recycler_view);
loading = findViewById(R.id.rotate_loading);
refreshLayout = findViewById(R.id.swipe_refresh_layout);
noDataContainer = findViewById(R.id.no_data_container);
title.setText("MovieDB");
setSupportActionBar(toolbar);
actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
toolbar.getNavigationIcon().setColorFilter(getResources().getColor(R.color.blue_gray_100), PorterDuff.Mode.SRC_ATOP);
searchView.setIconified(false);
closeIcon = searchView.findViewById(androidx.appcompat.R.id.search_close_btn);
searchText = searchView.findViewById(androidx.appcompat.R.id.search_src_text);
searchText.setTextColor(getResources().getColor(R.color.blue_gray_100));
closeIcon.setColorFilter(getResources().getColor(R.color.blue_gray_100));
presenter = new MovieSearchPresenter(this);
handler = new Handler();
searchRecyclerView.setLayoutManager(new GridLayoutManager(context, 2));
adapter = new MovieAdapter(context);
searchRecyclerView.setAdapter(adapter);
totalPagesCount = presenter.getTotalPage();
refreshLayout.setOnRefreshListener(() -> {
if (adapter.getList() != null) {
refreshLayout.setRefreshing(true);
adapter.getList().clear();
searchRecyclerView.setVisibility(View.GONE);
handler.postDelayed(() -> {
presenter.getMovieSearch(1, "");
searchView.setQuery("", false);
refreshLayout.setRefreshing(false);
}, 1500);
} else {
refreshLayout.setRefreshing(true);
searchRecyclerView.setVisibility(View.GONE);
handler.postDelayed(() -> {
searchView.setQuery("", false);
refreshLayout.setRefreshing(false);
}, 1500);
}
});
searchRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
GridLayoutManager manager = (GridLayoutManager) recyclerView.getLayoutManager();
visibleItems = manager.getChildCount();
totalItem = manager.getItemCount();
currentItemPosition = manager.findFirstVisibleItemPosition();
if ((visibleItems + currentItemPosition) >= totalItem) {
if (!isLoading) {
isLoading = true;
loading.setVisibility(View.VISIBLE);
loading.start();
handler.postDelayed(() -> presenter.increasePages(), 2000);
}
} else {
isLoading = false;
}
}
});
searchView.setOnSearchClickListener(v -> {
title.setVisibility(View.GONE);
searchView.requestFocus();
});
searchView.setOnCloseListener(() -> {
title.setVisibility(View.VISIBLE);
searchView.clearFocus();
return false;
});
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (adapter.getList() != null && adapter.getList().size() > 0) {
adapter.getList().clear();
}
presenter.getMovieSearch(1, newText);
return true;
}
});
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void MovieSearchList(List<Movies> movies) {
if (movies.size() <= 0) {
searchRecyclerView.setVisibility(View.GONE);
loading.setVisibility(View.GONE);
loading.stop();
noDataContainer.setVisibility(View.VISIBLE);
} else {
noDataContainer.setVisibility(View.GONE);
loading.setVisibility(View.GONE);
loading.stop();
searchRecyclerView.setVisibility(View.VISIBLE);
adapter.setList(movies);
adapter.notifyDataSetChanged();
}
}
@Override
public void showLoading() {
}
@Override
public void removeLoading() {
}
@Override
public void internetConnectionError(int internetConnectionIcon) {
}
здесь ведущий запрос
private SearchContract contract;
private int pages = 1;
private String query = "";
private ArrayList<Movies> movieList = new ArrayList<>();
private int totalPage;
public MovieSearchPresenter(SearchContract contract) {
this.contract = contract;
}
public void getMovieSearch(int pages, String query) {
this.query = query;
String url = EndPoints.SEARCH_BASE_URL + EndPoints.API_KEY + EndPoints.PAGES + String.valueOf(pages) + EndPoints.QUERY + query;
Log.e("search_url", url);
StringRequest request = new StringRequest(Request.Method.GET, url, response -> {
Gson gson = new GsonBuilder()
.setLenient()
.create();
MovieResponse movieResponse = gson.fromJson(response, MovieResponse.class);
totalPage = movieResponse.getPage();
movieList.addAll(movieResponse.getMovieList());
contract.MovieSearchList(movieList);
}, error -> contract.internetConnectionError(R.drawable.baseline_wifi_off_black_36));
RequestQueue queue = Volley.newRequestQueue(MovieApp.getInstance().getApplicationContext());
queue.add(request);
}
public int getTotalPage() {
return totalPage;
}
public void increasePages() {
pages++;
getMovieSearch(pages, query);
}
и xml расположение кода
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.MovieDB.ui.activity.Search">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/blue_gray_900">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:minHeight="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:gravity="center_vertical"
android:textColor="@color/blue_gray_100"
android:textSize="20sp"
android:visibility="gone" />
<androidx.appcompat.widget.SearchView
android:id="@+id/search_view"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.5"
android:gravity="center_vertical"
android:visibility="visible"
app:queryHint="movie name..."
app:searchHintIcon="@drawable/ic_search"
app:searchIcon="@drawable/ic_search" />
</LinearLayout>
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
<LinearLayout
android:id="@+id/no_data_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="8dp"
android:gravity="center"
android:orientation="vertical"
android:padding="8dp"
android:visibility="gone">
<ImageView
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_marginBottom="12dp"
android:src="@drawable/desert" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="No Movies Found"
android:textColor="@color/black"
android:textSize="26sp"
android:textStyle="bold" />
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/search_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<com.victor.loading.rotate.RotateLoading
android:id="@+id/rotate_loading"
android:layout_width="50dp"
android:layout_height="50dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:loading_color="@color/blue_gray_200"
app:loading_width="5dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
и вот сообщение об ошибке
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.MovieDB, PID: 27778
java.lang.NullPointerException: Attempt to read from field 'float
android.graphics.RectF.left' on a null object reference
at android.view.RecordingCanvas.drawArc(RecordingCanvas.java:67)
at com.victor.loading.rotate.RotateLoading.onDraw(RotateLoading.java:111)
at android.view.View.draw(View.java:20234)
at android.view.View.updateDisplayListIfDirty(View.java:19109)
at android.view.View.draw(View.java:19962)
at android.view.ViewGroup.drawChild(ViewGroup.java:4337)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4114)
at
androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:2023)
at android.view.View.updateDisplayListIfDirty(View.java:19100)
at android.view.View.draw(View.java:19962)
at android.view.ViewGroup.drawChild(ViewGroup.java:4337)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4114)
at android.view.View.updateDisplayListIfDirty(View.java:19100)
at android.view.View.draw(View.java:19962)
at android.view.ViewGroup.drawChild(ViewGroup.java:4337)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4114)
at android.view.View.updateDisplayListIfDirty(View.java:19100)
at android.view.View.draw(View.java:19962)
at android.view.ViewGroup.drawChild(ViewGroup.java:4337)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4114)
at android.view.View.updateDisplayListIfDirty(View.java:19100)
at android.view.View.draw(View.java:19962)
at android.view.ViewGroup.drawChild(ViewGroup.java:4337)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4114)
at android.view.View.updateDisplayListIfDirty(View.java:19100)
at android.view.View.draw(View.java:19962)
at android.view.ViewGroup.drawChild(ViewGroup.java:4337)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4114)
at android.view.View.updateDisplayListIfDirty(View.java:19100)
at android.view.View.draw(View.java:19962)
at android.view.ViewGroup.drawChild(ViewGroup.java:4337)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4114)
at android.view.View.draw(View.java:20237)
at com.android.internal.policy.DecorView.draw(DecorView.java:784)
at android.view.View.updateDisplayListIfDirty(View.java:19109)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:686)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:692)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:801)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:3402)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3199)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2558)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1535)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7405)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1044)
at android.view.Choreographer.doCallbacks(Choreographer.java:839)
at android.view.Choreographer.doFrame(Choreographer.java:774)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1030)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6864)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
Я даже не знаю, что здесь делает RectF.left, я много искал но ничего полезного я не нашел, поэтому, пожалуйста, любая вещь будет удивительной и спасибо