在Fragment中实现Searchview时出现空指针异常

时间:2019-07-28 19:04:08

标签: java android json searchview

以前,我在SearchView中成功实现了Activity。现在,我正在寻找在ViewPager适配器内部的一个片段中实现。但是不断地我得到一个空指针异常。

这是我的适配器

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> implements
        Filterable {
    private Context mContext;
    private ArrayList<ExampleItem> mExampleList;
    private ArrayList<ExampleItem> contactListFiltered;
    private OnItemClickListener mListener;
    private ExampleAdapterListener listener;

    public ExampleAdapter(Context context, ArrayList<ExampleItem> bookslist, ExampleAdapterListener listener) {

        this.mContext = context;
        this.listener = listener;
        this.mExampleList = bookslist;
        this.contactListFiltered = bookslist;
    }

    public void setOnItemClickListener(FragmentActivity activity) {
    }

    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    public ExampleAdapter(Context context, ArrayList<ExampleItem> exampleList, FragmentActivity activity) {
        mContext = context;
        mExampleList = exampleList;
    }

    @Override
    public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(mContext).inflate(R.layout.example_item, parent, false);
        return new ExampleViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ExampleViewHolder holder, int position) {
        ExampleItem currentItem = mExampleList.get(position);

         String title = currentItem.getTitle();
//        int likeCount = currentItem.getLikeCount();
//        String imageUrl = currentItem.getImageUrl();

          holder.mTextViewCreator.setText(title);
//        holder.mTextViewLikes.setText("Likes: " + likeCount);
//        Glide.with(mContext).load(imageUrl).apply(RequestOptions.circleCropTransform()).into(holder.mImageView);

    }

    @Override
    public int getItemCount() {
        return contactListFiltered.size();
    }

    @Override
    public Filter getFilter() {

        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();
                if (charString.isEmpty()) {
                    contactListFiltered = mExampleList;
                } else {
                    ArrayList<ExampleItem> filteredList = new ArrayList<>();
                    for (ExampleItem row : mExampleList) {

                        // name match condition. this might differ depending on your requirement
                        // here we are looking for name or phone number match
                        if (row.getTitle().toLowerCase().contains(charString.toLowerCase())) {
                            filteredList.add(row);
                        }
                    }

                    contactListFiltered = filteredList;
                }

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

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

    public class ExampleViewHolder extends RecyclerView.ViewHolder {

        public TextView mTextViewCreator;
//        public TextView mTextViewLikes;
//        public ImageView mImageView;

        public ExampleViewHolder(View itemView) {
            super(itemView);
//            mTextViewLikes = itemView.findViewById(R.id.text_view_likes);
//            mImageView = itemView.findViewById(R.id.image_view);
            mTextViewCreator = itemView.findViewById(R.id.text_title);


            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mListener != null) {
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION) {
                            mListener.onItemClick(position);
                        }
                    }
                }
            });
        }
    }

    public interface ExampleAdapterListener {
        void onContactSelected(ExampleItem contact);
    }
}

在以下代码中,我得到了空指针异常。

@Override
public int getItemCount() {
    return contactListFiltered.size();
}

我的片段代码是

public class Mylecture extends Fragment implements ExampleAdapter.OnItemClickListener, SwipeRefreshLayout.OnRefreshListener, ExampleAdapter.ExampleAdapterListener {
    public static final String YTD_LINK = "link";
    private ProgressBar myProgressBar;
    private RecyclerView mRecyclerView;
    private ExampleAdapter mExampleAdapter;
    private ArrayList<ExampleItem> mExampleList;
    private SearchView searchView;
    private RequestQueue mRequestQueue;
    SwipeRefreshLayout mSwipeRefreshLayout;
    String url;

    public Mylecture() {
        // Required empty public constructor
    }

    private RecyclerView grade, subject, gender, location;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.activity_jsonfeed, container, false);

        Bundle bundle = getArguments();
        if(bundle!=null){
            url = bundle.getString("key_one");
        }

        mRecyclerView = view.findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        mRecyclerView.addItemDecoration(new MyDividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL, 36));

        mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_layout);
        mSwipeRefreshLayout.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorBackground);

        myProgressBar = view.findViewById(R.id.myProgressBar);
        myProgressBar.setIndeterminate(true);
        myProgressBar.setVisibility(View.VISIBLE);
        mRequestQueue = Volley.newRequestQueue(getActivity());

        // SearchBox
        searchView = (SearchView) view.findViewById(R.id.search);
        searchView.setIconifiedByDefault(false);
        searchView.setFocusable(false);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String queryString) {
                mExampleAdapter.getFilter().filter(queryString);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String queryString) {
                mExampleAdapter.getFilter().filter(queryString);
                return false;
            }
        });


//        EndSearch


//        if (!CheckInternet.getInstance(getActivity()).isOnline()) {
//
//
//        } else {


            updateListContent();
        mExampleList = new ArrayList<>();
        mExampleAdapter = new ExampleAdapter(getActivity(), mExampleList,  getActivity());
        mExampleAdapter.setOnItemClickListener(getActivity());
        mRecyclerView.setHasFixedSize(true);
        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(llm);
        mRecyclerView.setAdapter(mExampleAdapter);

            mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    updateListContent();
                }
            });

        return view;
    }

    public void updateListContent() {
        mSwipeRefreshLayout.setRefreshing(true);
        if (mExampleList != null)
            mExampleList.clear();
        parseJSON();
    }

    private void parseJSON() {

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {

                        myProgressBar.setVisibility(View.GONE);

                        try {
                            JSONArray jsonArray = response.getJSONArray("hits");

                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject hit = jsonArray.getJSONObject(i);
                                String videoTitle = hit.getString("title");
                                String link = hit.getString("link");


                                mExampleList.add(new ExampleItem(videoTitle, link));
                                mExampleAdapter.notifyDataSetChanged();
                            }


                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                        mSwipeRefreshLayout.setRefreshing(false);
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
                mSwipeRefreshLayout.setRefreshing(false);
            }
        });

        mRequestQueue.add(request);
    }

    @Override
    public void onItemClick(int position) {
        Intent ytdIntent = new Intent(getActivity(), YoutubePlayerActivity.class);
        ExampleItem clickedItem = mExampleList.get(position);
            ytdIntent.putExtra(YTD_LINK, clickedItem.getmLink());
            startActivity(ytdIntent);


    }

    @Override
    public void onRefresh() {

    }

    @Override
    public void onContactSelected(ExampleItem contact) {

    }
}

在该片段中,我正在从json在线加载一些数据并将其加载到RecyclerView中,而我的基本需求是希望实现一个SearchView,该搜索并显示基于我从json检索到的标题上。

以前,我在Activity中成功实现了该功能,但是在一个片段中,我无法实现,并且抛出了空指针异常。

1 个答案:

答案 0 :(得分:1)

parseJSON函数中,仅在ArrayList中添加项目并不能帮助您在RecyclerView中获取更新的数据。我建议您将其更改为以下内容。

获得一个函数来更新适配器中的列表并像下面那样修改适配器。

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> implements
        Filterable {
    private Context mContext;
    private ArrayList<ExampleItem> mExampleList = new ArrayList<ExampleItem>();
    private ArrayList<ExampleItem> contactListFiltered = new ArrayList<ExampleItem>();
    private OnItemClickListener mListener;
    private ExampleAdapterListener listener;

    public ExampleAdapter(Context context, ArrayList<ExampleItem> bookslist, ExampleAdapterListener listener) {
        this.mContext = context;
        this.listener = listener;
        this.mExampleList = bookslist;
        this.contactListFiltered = bookslist;
    }

    public void setOnItemClickListener(FragmentActivity activity) {
    }

    public interface OnItemClickListener {
        void onItemClick(int position);
    }


    public ExampleAdapter(Context context, ArrayList<ExampleItem> exampleList) {
        mContext = context;
        mExampleList = exampleList;
        contactListFiltered = exampleList; // Add the exampleList here as well
    }

    // Here I added the update list function
    public void updateList(ArrayList<ExampleItem> exampleList) {
        mExampleList = exampleList;
        contactListFiltered = exampleList; // Add the exampleList here as well
    }

    @Override
    public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(mContext).inflate(R.layout.example_item, parent, false);
        return new ExampleViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ExampleViewHolder holder, int position) {
        ExampleItem currentItem = mExampleList.get(position);

        String title = currentItem.getTitle();
        holder.mTextViewCreator.setText(title);
    }

    @Override
    public int getItemCount() {
        return contactListFiltered.size();
    }

    @Override
    public Filter getFilter() {

        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();
                if (charString.isEmpty()) {
                    contactListFiltered = mExampleList;
                } else {
                    ArrayList<ExampleItem> filteredList = new ArrayList<>();
                    for (ExampleItem row : mExampleList) {

                        // name match condition. this might differ depending on your requirement
                        // here we are looking for name or phone number match
                        if (row.getTitle().toLowerCase().contains(charString.toLowerCase())) {
                            filteredList.add(row);
                        }
                    }

                    contactListFiltered = filteredList;
                }

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

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


    public class ExampleViewHolder extends RecyclerView.ViewHolder {

        public TextView mTextViewCreator;

        public ExampleViewHolder(View itemView) {
            super(itemView);
            mTextViewCreator = itemView.findViewById(R.id.text_title);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mListener != null) {
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION) {
                            mListener.onItemClick(position);
                        }
                    }
                }
            });
        }
    }

    public interface ExampleAdapterListener {
        void onContactSelected(ExampleItem contact);
    }
}

然后按如下所示修改parseJSON函数。

private void parseJSON() {
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {

                    myProgressBar.setVisibility(View.GONE);

                    try {
                        JSONArray jsonArray = response.getJSONArray("hits");

                        for (int i = 0; i < jsonArray.length(); i++) {
                            JSONObject hit = jsonArray.getJSONObject(i);
                            String videoTitle = hit.getString("title");
                            String link = hit.getString("link");

                            mExampleList.add(new ExampleItem(videoTitle, link));
                            // Move this outside of the for loop
                            // mExampleAdapter.notifyDataSetChanged();
                        }

                        // Update the list here and then call notifyDataSetChanged
                        mExampleAdapter.updateList(mExampleList);
                        mExampleAdapter.notifyDataSetChanged();

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                    mSwipeRefreshLayout.setRefreshing(false);
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
            mSwipeRefreshLayout.setRefreshing(false);
        }
    });

    mRequestQueue.add(request);
}

希望能解决您的问题。