В этот раз я столкнулся с другой проблемой, которую я пытаюсь отфильтровать с помощью поиска в RecyclerView, и, скорее всего, потому что я не знаю, как инициализировать адаптер, в то время как другие методы остаются нормальными, я провел исследование, и этомой окончательный код для Main3Activity;
private static final String TAG = "Main3Activity";
private final String JSON_URL = "https://MYURLXXX" ;
private JsonArrayRequest request ;
private RequestQueue requestQueue ;
private List<Anime> lstAnime ;
private RecyclerView recyclerView ;
private RecyclerViewLiveAdapter adapter;
RecyclerView.LayoutManager layoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
lstAnime = new ArrayList<>() ;
recyclerView = findViewById(R.id.recyclerviewid);
jsonrequest();
}
private void jsonrequest() {
request = new JsonArrayRequest(JSON_URL, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
JSONObject jsonObject = null ;
for (int i = 0 ; i < response.length(); i++ ) {
try {
jsonObject = response.getJSONObject(i) ;
Anime anime = new Anime() ;
anime.setName(jsonObject.getString("name"));
anime.setDescription(jsonObject.getString("description"));
anime.setRating(jsonObject.getString("Rating"));
anime.setCategorie(jsonObject.getString("categorie"));
anime.setStudio(jsonObject.getString("studio"));
anime.setImage_url(jsonObject.getString("img"));
anime.setLink(jsonObject.getString("link"));
anime.setDrm_scheme(jsonObject.getString("drm_scheme"));
anime.setDrm_license_url(jsonObject.getString("drm_license_url"));
anime.setDrm(jsonObject.getString("drm"));
anime.setSubtitle(jsonObject.getString("subtitle"));
anime.setSubtitle1(jsonObject.getString("subtitle1"));
anime.setSubtitle2(jsonObject.getString("subtitle2"));
lstAnime.add(anime);
} catch (JSONException e) {
e.printStackTrace();
}
setuprecyclerview(lstAnime);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue = Volley.newRequestQueue(Main3Activity.this);
requestQueue.add(request) ;
}
private void setuprecyclerview(List<Anime> lstAnime) {
RecyclerViewLiveAdapter myadapter = new RecyclerViewLiveAdapter(this,lstAnime) ;
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(myadapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_item,menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
{
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (adapter == null){
adapter.getFilter().filter(newText);}
return false;
}
});
return true;
}
}
и части фильтра в моем адаптере;
@Override
public Filter getFilter() {
return exampleFilter;
}
private Filter exampleFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Anime> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(mDataFull);
} else {
String filterpattern = constraint.toString().toLowerCase().trim();
for (Anime anime : mDataFull) {
if (anime.getName().toLowerCase().contains(filterpattern)) {
filteredList.add(anime);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mData.clear();
mData.addAll((List) results.values);
notifyDataSetChanged();
}
};
Как вы можете видеть, я использую метод setuprecyclerview();этот метод после получения ответа JSON инициализирует адаптер. Но с этим кодом, не меняя ничего, невозможно установить адаптер после фильтрации
if (adapter == null){
adapter.getFilter().filter(newText);}
return false;
Если я изменю adapter == null
на adapter != null
функцию поиска и раскладки клавиатуры-вверх, но он не запускает событие фильтра, весь просмотр реселлера остается тем же. Так что, когда я оставляю его как адаптер == ноль, он выбрасывает NPE, если вы посмотрите вниз, вы увидите, что getFilter в моем адаптере равен нулю, потому что яневозможно выполнить инициализацию адаптера после фильтрации. Итак, как я могу добиться этого, сохраняя другие методы такими же и безопасными?Какие части я должен изменить?Заранее спасибо.
2019-03-13 02:23:56.374 27544-27544/com.demotxt.myapp.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.demotxt.myapp.myapplication, PID: 27544
java.lang.NullPointerException: Attempt to invoke virtual method 'android.widget.Filter com.demotxt.myapp.myapplication.adapters.RecyclerViewLiveAdapter.getFilter()' on a null object reference
at com.demotxt.myapp.myapplication.activities.Main3Activity$3.onQueryTextChange(Main3Activity.java:138)
at android.support.v7.widget.SearchView.onTextChanged(SearchView.java:1180)
at android.support.v7.widget.SearchView$10.onTextChanged(SearchView.java:1714)
at android.widget.TextView.sendOnTextChanged(TextView.java:9413)
at android.widget.TextView.setText(TextView.java:5086)
at android.widget.TextView.setText(TextView.java:4908)
at android.widget.EditText.setText(EditText.java:110)
at android.widget.TextView.setText(TextView.java:4883)
at android.support.v7.widget.SearchView.onActionViewExpanded(SearchView.java:1294)
at android.support.v7.widget.Toolbar$ExpandedActionViewMenuPresenter.expandItemActionView(Toolbar.java:2396)
at android.support.v7.view.menu.MenuBuilder.expandItemActionView(MenuBuilder.java:1348)
at android.support.v7.view.menu.MenuItemImpl.expandActionView(MenuItemImpl.java:810)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:978)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:963)
at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:624)
at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:150)
at android.view.View.performClick(View.java:6205)
at android.widget.TextView.performClick(TextView.java:11103)
at android.view.View$PerformClick.run(View.java:23653)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)