0

Hello I have follow this link How to highlight filtered text in RecyclerView when using SearchView widget to make custom filtered list in recyclerview. But it doesn't work to my case, what's wrong with my code? I''ll really apreciate if you can look and assits ..

Thanks to SaravInfern to pay attention to my case, the filtered was succes but not change the color

This is my adapter:

public class TanamanAdapter extends RecyclerView.Adapter<DaftarTanamanVH>{
private List<Tanaman> mTanaman;
private ImageLoader imageLoader;
private Context context;
String searchText = "";

public TanamanAdapter(List<Tanaman> mTanaman, Context context){
    this.mTanaman = mTanaman;
    this.context = context;
}

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

@Override
public void onBindViewHolder(DaftarTanamanVH holder, int position) {
    final Tanaman tanaman = mTanaman.get(position);
    String namaTanaman = tanaman.getNama_tanaman();
    String namaIlmiah = tanaman.getNama_ilmiah();
    String urlGambar = tanaman.getUrlGambar();


    imageLoader = CustomVolleyRequest.getInstance(context).getImageLoader();
    imageLoader.get(urlGambar,ImageLoader.getImageListener(holder.networkImageView,R.mipmap.ic_launcher,android.R.drawable.ic_dialog_alert));

    //holder.bind(tanaman);
    holder.tv_nama_tanaman.setText(namaTanaman);
    holder.networkImageView.setImageUrl(urlGambar,imageLoader);

    if(searchText.length() > 0){
        int index = namaIlmiah.indexOf(searchText);
        while(index > 0){
            SpannableStringBuilder sb = new SpannableStringBuilder(namaIlmiah);
            ForegroundColorSpan fcs = new ForegroundColorSpan(Color.BLUE);
            sb.setSpan(fcs,index,searchText.length(),Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
            index = namaIlmiah.indexOf(searchText,index+1);
            holder.tv_nama_ilmiah.setText(sb);
        }
    }else{
        holder.tv_nama_ilmiah.setText(namaIlmiah);
    }


    /*
    holder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(v.getContext(), DetailTanaman.class);
            intent.putExtra("KEY_ID",tanaman.getId_tanaman());
            intent.putExtra("KEY_NAMA",tanaman.getNama_tanaman());
            intent.putExtra("KEY_ILMIAH",tanaman.getNama_ilmiah());
            intent.putExtra("KEY_GAMBAR",tanaman.getUrlGambar());
            v.getContext().startActivity(intent);
        }
    });*/

}

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

public void setFilter(List<Tanaman> tanamanList, String searchText){
    mTanaman = new ArrayList<>();
    mTanaman.addAll(tanamanList);
    this.searchText = searchText;
    notifyDataSetChanged();
}

}

This is my Activity:

public class DaftarTanaman extends AppCompatActivity implements SearchView.OnQueryTextListener{

private RecyclerView recyclerView;
private List<Tanaman> mTanaman;
private TanamanAdapter tanamanAdapter;


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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);


    recyclerView = (RecyclerView) findViewById(R.id.rv_daftar_tanaman);
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);

    mTanaman = new ArrayList<>();

    getDataTanaman();
}


private void getDataTanaman() {
    final ProgressDialog loading = ProgressDialog.show(this,"Mohon tunggu ...","Sedang mengambil data...",false,false);

    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(ConfigTanaman.DATA_URL_TANAMAN, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray jsonArray) {
            loading.dismiss();
            parseData(jsonArray);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {

        }
    });
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(jsonArrayRequest);
}

private void parseData(JSONArray jsonArray) {
    for(int i=0;i<jsonArray.length();i++){
        Tanaman tanaman = new Tanaman();
        JSONObject jsonObject = null;
        try{
            jsonObject = jsonArray.getJSONObject(i);
            tanaman.setId_tanaman(jsonObject.getString(ConfigTanaman.TAG_ID));
            tanaman.setNama_tanaman(jsonObject.getString(ConfigTanaman.TAG_NAMA));
            tanaman.setNama_ilmiah(jsonObject.getString(ConfigTanaman.TAG_ILMIAH));
            tanaman.setUrlGambar(jsonObject.getString(ConfigTanaman.TAG_URL_GAMBAR));
        }catch(JSONException e){
            e.printStackTrace();
        }
        mTanaman.add(tanaman);
    }
    tanamanAdapter = new TanamanAdapter(mTanaman,this);
    recyclerView.setAdapter(tanamanAdapter);
}

@Override
public boolean onQueryTextSubmit(String query) {
    final List<Tanaman> filteredTanaman = filter(mTanaman,query);
    tanamanAdapter.setFilter(filteredTanaman,query);
    if(filteredTanaman.size() == 0){
        Toast.makeText(DaftarTanaman.this, "Maaf, data dengan kata kunci "+query+" tidak ditemukan", Toast.LENGTH_SHORT).show();
        return false;
    }
    return true;
}

private List<Tanaman> filter(List<Tanaman> models, String query) {
    query = query.toLowerCase();
    final List<Tanaman> filteredTanaman = new ArrayList<>();
    KMP kmp = new KMP();
    for(Tanaman model: models){
        final String source = model.getNama_tanaman().toLowerCase();
        int pos = kmp.postMatch(source,query);
        if(pos != -1){
            filteredTanaman.add(model);
        }
    }
    return filteredTanaman;
}


@Override
public boolean onQueryTextChange(String newText) {
    return false;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main,menu);
    final MenuItem item = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setOnQueryTextListener(this);

    MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            return true;
        }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            tanamanAdapter.setFilter(mTanaman,"");
            return true;
        }
    });
    return super.onCreateOptionsMenu(menu);
}
}

This is the log cat which show the errors:

FATAL EXCEPTION: main
                                                                             Process: id.tanamanobat.skripsi.qori.ensiklopeditanamanobat, PID: 2927
                                                                                              java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
                                                                                                  at id.tanamanobat.skripsi.qori.ensiklopeditanamanobat.Adapter.TanamanAdapter.onBindViewHolder(TanamanAdapter.java:67)
                                                                                                  at id.tanamanobat.skripsi.qori.ensiklopeditanamanobat.Adapter.TanamanAdapter.onBindViewHolder(TanamanAdapter.java:35)
                                                                                                  at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5471)
                                                                                                  at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5504)
                                                                                                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4741)
                                                                                                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617)
                                                                                                  at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994)
                                                                                                  at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390)
                                                                                                  at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353)
                                                                                                  at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574)
                                                                                                  at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028)
                                                                                                  at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2906)
                                                                                                  at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283)
                                                                                                  at android.view.View.layout(View.java:15596)
                                                                                                  at android.view.ViewGroup.layout(ViewGroup.java:4966)
                                                                                                  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076)
                                                                                                  at android.view.View.layout(View.java:15596)
                                                                                                  at android.view.ViewGroup.layout(ViewGroup.java:4966)
                                                                                                  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
                                                                                                  at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
                                                                                                  at android.view.View.layout(View.java:15596)
                                                                                                  at android.view.ViewGroup.layout(ViewGroup.java:4966)
                                                                                                  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
                                                                                                  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
                                                                                                  at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
                                                                                                  at android.view.View.layout(View.java:15596)
                                                                                                  at android.view.ViewGroup.layout(ViewGroup.java:4966)
                                                                                                  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
                                                                                                  at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
                                                                                                  at android.view.View.layout(View.java:15596)
                                                                                                  at android.view.ViewGroup.layout(ViewGroup.java:4966)
                                                                                                  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
                                                                                                  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
                                                                                                  at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
                                                                                                  at android.view.View.layout(View.java:15596)
                                                                                                  at android.view.ViewGroup.layout(ViewGroup.java:4966)
                                                                                                  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
                                                                                                  at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
                                                                                                  at android.view.View.layout(View.java:15596)
                                                                                                  at android.view.ViewGroup.layout(ViewGroup.java:4966)
                                                                                                  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2072)
                                                                                                  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1829)
                                                                                                  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
                                                                                                  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
                                                                                                  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
                                                                                                  at android.view.Choreographer.doCallbacks(Choreographer.java:580)
                                                                                                  at android.view.Choreographer.doFrame(Choreographer.java:550)
                                                                                                  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
                                                                                                  at android.os.Handler.handleCallback(Handler.java:739)
                                                                                                  at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                                  at android.os.Looper.loop(Looper.java:135)
                                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5221)
                                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                                  at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
                                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.jav

Here is the screenshot:

filtered text is not change

Community
  • 1
  • 1

2 Answers2

0

from your logcat error Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference I can say that, when you create Adapter your searchText is null, you are storing value in it while calling setFilter, so the simplest solution is to assign blank value to your searchText

String searchText = "";
Ravi
  • 34,851
  • 21
  • 122
  • 183
  • thank's for your attention, i have change it but the problem is, when the result appears it's not change the color of the text result – Mohamad Firdaus Nov 14 '16 at 05:34
0

you must initialize the searchText like this String searchText = ""; or do a null check

if(searchText.length() > 0 && searchText!=null){
        int index = namaIlmiah.indexOf(searchText);
        while(index > 0){
            SpannableStringBuilder sb = new SpannableStringBuilder(namaIlmiah);
            ForegroundColorSpan fcs = new ForegroundColorSpan(Color.BLUE);
            sb.setSpan(fcs,index,searchText.length(),Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
            index = namaIlmiah.indexOf(searchText,index+1);
            holder.tv_nama_ilmiah.setText(sb);
        }
    }else{
        holder.tv_nama_ilmiah.setText(namaIlmiah);
    }
SaravInfern
  • 3,338
  • 1
  • 20
  • 44