【问题标题】:Android Searchview filter recyclerview volley implementationAndroid Searchview过滤器recyclerview volley实现
【发布时间】:2019-08-04 18:15:26
【问题描述】:

我正在使用我加载列表的搜索视图实现搜索过滤器 成功,当我点击 searchview 并输入 word 下面的应用程序崩溃是错误代码:

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
    // private static final String url = "http://example.com/OnlineDoctor/mobileapp/doctors_list.php?";
    private List<ListItems> listItemses;
    private RecyclerView recyclerView;
    private MainFilteredAdapter mrecyclerViewAdapter;
    private LinearLayoutManager linearLayoutManager;
    private static final String TAG = MainActivity.class.getSimpleName();
    private RelativeLayout ownerlayout;
    private SearchView searchView;
    private String logintype, property_id;
    private String userid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.recyclerview);
            listItemses = new ArrayList<>();
            mrecyclerViewAdapter = new 
            MainFilteredAdapter(listItemses,getApplicationContext());
            linearLayoutManager = new LinearLayoutManager(this);
            recyclerView.setLayoutManager(linearLayoutManager);
            recyclerView.setItemAnimator(new DefaultItemAnimator());
            recyclerView.setAdapter(mrecyclerViewAdapter);
            loadRenterList();
        }
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView = (SearchView) menu.findItem(R.id.action_search)
                .getActionView();
        searchView.setSearchableInfo(searchManager
                .getSearchableInfo(getComponentName()));
        searchView.setMaxWidth(Integer.MAX_VALUE);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                mrecyclerViewAdapter.getFilter().filter(query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String query) {
                mrecyclerViewAdapter.getFilter().filter(query);
                return false;
            }
        });
        return true;
    }

    public void loadRenterList() {
        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
                url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
    JSONArray jsonArray = null;
                        JSONObject jsonObject = null;
                        try {
                            jsonArray = response.getJSONArray("data");
                            for (int i = 0; i < jsonArray.length(); i++) {
                         JSONObject mjsonObject = (JSONObject) jsonArray.get(i);
                                ListItems newslist = new ListItems();
                                newslist.setId(mjsonObject.getString("id"));
                                listItemses.add(newslist);
                                mrecyclerViewAdapter.notifyDataSetChanged();
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                            Toast.makeText(getApplicationContext(),
                                    "Error: " + e.getMessage(),
                                    Toast.LENGTH_LONG).show();
                        }
                    }
                    // adapter.notifyDataSetChanged();
                }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
            }
        });
        AppController.getInstance().addToRequestQueue(jsonObjReq);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView = (SearchView) menu.findItem(R.id.action_search)
                .getActionView();
        searchView.setSearchableInfo(searchManager
                .getSearchableInfo(getComponentName()));
        searchView.setMaxWidth(Integer.MAX_VALUE);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                mrecyclerViewAdapter.getFilter().filter(query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String query) {
                mrecyclerViewAdapter.getFilter().filter(query);
                return false;
            }
        });
        return true;
    }


    public class MainFilteredAdapter extends RecyclerView.Adapter<MainFilteredAdapter.MyViewHolder> implements Filterable {

    private List<ListItems> doctorlist;
    private List<ListItems> doctorlistFiltered;
    Context context;
    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        public TextView spec_name,placeName,property_status;
        public ImageView imageView;
        LinearLayout lllistrow;

        public MyViewHolder(View itemView) {
            super(itemView);
            property_status =  itemView.findViewById(R.id.duration);
            spec_name =  itemView.findViewById(R.id.spec_name);
            placeName =  itemView.findViewById(R.id.placeName);
            imageView =  itemView.findViewById(R.id.placeImage);
            lllistrow=  itemView.findViewById(R.id.mainHolder);
            lllistrow.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            int position = getLayoutPosition();
            switch (v.getId()) {
                case R.id.mainHolder: 
                break;
            }
        }
    }

    public MainFilteredAdapter(List<ListItems> boardList, Context context) {
        this.doctorlist = boardList;
        this.doctorlistFiltered=boardList;
        this.context = context;
    }

    @Override
    public MainFilteredAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.listitem, parent, false);

        return new MainFilteredAdapter.MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MainFilteredAdapter.MyViewHolder holder, int position) {

        ListItems listItems = doctorlistFiltered.get(position);
        /*Picasso.with(context).load("http://neweraprime.com/SFDS/faculty/Upload/Books/" + newslist.get(position).getThumbnailUrl())
                .placeholder(R.drawable.ic_pdffile).error(R.drawable.ic_pdffile).resize(256, 256).onlyScaleDown()  //Url of the image to load.
                .into(holder.thumbNail);*/
        holder.property_status.setText(listItems.getPayment_status());
        holder.spec_name.setText(listItems.getAddress());
        holder.placeName.setText(listItems.getTitle());

    }

    @Override
    public Filter getFilter()
    {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();
                if (charString.isEmpty()) {
                    doctorlistFiltered = doctorlist;
                } else {
                    List<ListItems> filteredList = new ArrayList<>();
                    for (ListItems row : doctorlist) {
                        // name match condition. this might differ depending on your requirement
                        // here we are looking for name or phone number match
                        if (row.getCity().toLowerCase().contains(charString.toLowerCase()) || row.getAddress().contains(charSequence)) {
                            filteredList.add(row);
                        }
                    }
                    doctorlistFiltered = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = doctorlistFiltered;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                doctorlistFiltered = (ArrayList<ListItems>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    }

    @Override
    public int getItemCount() {
        if(doctorlist != null){
            return doctorlistFiltered.size();
        } else {
            return 0;
        }
    }

这是错误

java.lang.NullPointerException:尝试在空对象引用上调用接口方法“int java.util.List.size()” 在 com.www.homerent.MainFilteredAdapter.getItemCount(MainFilteredAdapter.java:129) 在 androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:4025) 在 androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3830) 在 androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4385) 在 android.view.View.layout(View.java:19659) 在 android.view.ViewGroup.layout(ViewGroup.java:6075) 在 android.widget.RelativeLayout.onLayout(RelativeLayout.java:1083) 在 android.view.View.layout(View.java:19659) 在 android.view.ViewGroup.layout(ViewGroup.java:6075)

【问题讨论】:

  • 看起来你需要添加一些断点并弄清楚为什么医生列表过滤器为空。
  • 我调试它并检查但医生列表过滤器不为空
  • 你确定要在之后调用doctorlistFiltered.size() 时检查doctorlist != null 吗?
  • 是的,我现在检查一下

标签: java android android-recyclerview android-volley searchview


【解决方案1】:

我怀疑你的问题在这里:

@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
    doctorlistFiltered = (ArrayList<ListItems>) filterResults.values;
    notifyDataSetChanged();
}

尝试改用这个:

@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
    doctorlistFiltered = new ArrayList<ListItems>();
    if (filterResults.values != null) {
        doctorlistFiltered.addAll((ArrayList<ListItems>) filterResults.values);
    }
    notifyDataSetChanged();
}

我没有看到任何东西可以保证 filterResults.values 确实包含非空值
(例如,在过滤过程中出现错误的情况下)。


附言:
在 cmets 中将 getItemCount() 调整为 metionend 应该是给定的。

【讨论】:

  • 感谢我现在在输入 no item show 时使用上面的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2017-11-02
  • 1970-01-01
  • 2016-10-29
相关资源
最近更新 更多