こんにちは私はこのリンクHow to highlight filtered text in RecyclerView when using SearchView widgetを使用して、recyclerviewでカスタムフィルタリングリストを作成しています。しかし、私の場合はうまくいきません。私のコードに何が問題なのですか?あなたが見て、assitsことができればI''llは本当に私の場合に注意を払うようにSaravInfernに...フィルタリングされたスパニング可能なテキストが私の場合では機能しません
感謝をapreciate、フィルター大成功だったが、色
を変更しないこれが私のアダプタです:
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();
}
}
これが私の活動です:
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);
}
}
これは、エラーを表示し、ログの猫です:
ここ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
はスクリーンショットです:
感謝のは、あなたの注意にnullチェックを行う、私はそれを変更する必要がありますが、結果はそれが –