这一次我面临着另一个问题,我试图用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响应后,使用此代码初始化adapter.But,而不会更改任何内容。在过滤之后,不可能设置适配器
if (adapter == null){
adapter.getFilter().filter(newText);}
return false;
如果我将adapter == null
更改为adapter != null
搜索功能,键盘弹出,但它没有触发过滤器事件,整个回收器视图保持same.So当我保持它作为适配器==空它抛出一个NPE,如果你往下看你会看到我的适配器中的getFilter是空的,因为我不能使适配器在filtering.So之后初始化,我如何才能在保持其他方法相同和安全的同时实现这一点?我需要更改哪些部分?提前谢谢。
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)
发布于 2019-03-13 07:49:29
您引用的适配器对象为空。不需要在setuprecyclerview()方法中再次为适配器创建实例,因为您已经为它创建了一个全局引用变量。相反,请执行以下操作,
private void setuprecyclerview(List<Anime> lstAnime) {
adapter = new RecyclerViewLiveAdapter(this,lstAnime) ;
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
}
另外,您应该在onQueryTextChange()方法中检查该适配器对象是否不为空。
if (adapter != null){
adapter.getFilter().filter(newText);
}
https://stackoverflow.com/questions/55132241
复制相似问题