Nicola
Nicola

Reputation: 423

NullPointException with searching EditText for a RecyclerView

Im working on app where i implemented a section, there is an activity that when it start, make an http call and parse the json, for every element there is an image and a title, it work all fine, now i have to implement a searchbar with an EditText, the issues is: when i type the first letter the app crash and give me a null poin exception.

The error is: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.ticket_odt.Activity.adapters.RecyclerViewAdapter.filterList(java.util.ArrayList)' on a null object reference

The code:

public class Musemunt extends AppCompatActivity {

private final String JSON_URL = "https://sandbox.musement.com/api/v3/cities";
private JsonArrayRequest request;
private RequestQueue requestQueue;
private List<ActivitiesList> listAct;
private RecyclerView recyclerView;
private EditText metSearchMusemunt;
private RecyclerViewAdapter mAdapter;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_musemunt);

    listAct = new ArrayList<>();
    recyclerView = findViewById(R.id.recyclerviewmusemunt);
    jsonrequest();

    metSearchMusemunt = findViewById(R.id.etSearchMusemunt);
    metSearchMusemunt.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
            filter(editable.toString());
        }
    });
}

private void filter(String text){
    ArrayList<ActivitiesList> filteredList = new ArrayList<>();

    for (ActivitiesList item : listAct){
        if (item.getCityName().toLowerCase().contains(text.toLowerCase())){
            filteredList.add(item);
        }
    }
    mAdapter.filterList(filteredList);
}

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);
                    ActivitiesList activitiesList = new ActivitiesList();
                    activitiesList.setCityName(jsonObject.getString("name"));
                    activitiesList.setImgUrl(jsonObject.getString("cover_image_url"));
                    listAct.add(activitiesList);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            setuprecyclerview(listAct);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(Musemunt.this, "ERROR RESPONSE", Toast.LENGTH_SHORT).show();
        }
    });

    requestQueue = Volley.newRequestQueue(Musemunt.this);
    requestQueue.add(request);

}

private void setuprecyclerview(List<ActivitiesList> listAct){
    RecyclerViewAdapter myadapter = new RecyclerViewAdapter(this, listAct);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(myadapter);
}

}

The adapter:

`package com.example.ticket_odt.Activity.adapters;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.example.ticket_odt.Activity.model.ActivitiesList;
import com.example.ticket_odt.R;

import java.util.ArrayList;
import java.util.List;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.myViewHolder>{

    private Context mContext;
    private List<ActivitiesList> mData;
    RequestOptions option;


    public RecyclerViewAdapter(Context mContext, List<ActivitiesList> mData) 

{
        this.mContext = mContext;
        this.mData = mData;
    option = new RequestOptions().centerCrop().placeholder(R.drawable.logo_musement).error(R.drawable.logo_musement);
}

@NonNull
@Override
public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view;
    LayoutInflater inflater = LayoutInflater.from(mContext);
    view = inflater.inflate(R.layout.activities_list_row_item, parent, false);

    return new myViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull myViewHolder holder, int position) {

    holder.tv_name.setText(mData.get(position).getCityName());
    Glide.with(mContext).load(mData.get(position).getImgUrl()).apply(option).into(holder.thumb);
}

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

public class myViewHolder extends RecyclerView.ViewHolder{

    TextView tv_name;
    ImageView thumb;


    public myViewHolder(@NonNull View itemView) {
        super(itemView);

        tv_name = itemView.findViewById(R.id.MusemuntListTitle);
        thumb = itemView.findViewById(R.id.MusemuntThumb);
    }
}

public void filterList(ArrayList<ActivitiesList> filteredList) {
    li = filteredList;
    notifyDataSetChanged();
}

}

The XML: `<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context=".Activity.BuyItemActivity.Musemunt"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="10dp">

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/etSearchMusemunt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Cosa stai cercando?"
        android:layout_margin="16dp"/>

</LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="600dp"
        android:layout_marginTop="49dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        >
<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerviewmusemunt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
</ScrollView>
    </LinearLayout>

</LinearLayout>

Thank You In advance!

Upvotes: 0

Views: 181

Answers (1)

shb
shb

Reputation: 6277

You forgot to initialize mAdapter.

Initialize your RecyclerView adapter set it to your recyclerview.

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_musemunt);
    listAct = new ArrayList<>();
    mAdapter = new RecyclerViewAdapter(this, listAct);

    recyclerView = findViewById(R.id.recyclerviewmusemunt);
    //....
    recyclerView.setAdapter(mAdapter);
    //...

A Better Approach for Filtering RecyclerView items is to implement Filterable.

Implementing Search filter

Upvotes: 2

Related Questions