i want to make a filter search function to my jsonobject array in recyclerview
i tried the getfilter in my adapter and pass it to my add_detail but it gives me force close when i type a text in my app_detail activity
heres my app_detail.java :
public class app_detail extends AppCompatActivity implements PemrogramanAdapter.OnItemClickListener {
TextView nametxt;
ImageView imageView,listimageview;
private RecyclerView mRecyclerView;
private List<Object> mRecyclerViewItems = new ArrayList<>();
private SearchView searchView;
PemrogramanAdapter pemrogramanAdapters;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app_detail);
nametxt = (TextView) findViewById(R.id.list_app_text_detail);
imageView = (ImageView) findViewById(R.id.list_app_image_detail);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setTitle("test");
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view1);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
PemrogramanAdapter pemrogramanAdapter = new PemrogramanAdapter(this,mRecyclerViewItems);
mRecyclerView.setAdapter(pemrogramanAdapter);
pemrogramanAdapter.setmListener(app_detail.this);
tambahMenuItemDariJson();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu,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 s) {
pemrogramanAdapters.getFilter().filter(s);
return false;
}
@Override
public boolean onQueryTextChange(String s) {
pemrogramanAdapters.getFilter().filter(s);
return false;
}
});
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if(id == R.id.action_search)
return true;
if(id == android.R.id.home)
this.finish();
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if(!searchView.isIconified())
{
searchView.setIconified(true);
return;
}
super.onBackPressed();
Animatoo.animateZoom(app_detail.this);
}
private void tambahMenuItemDariJson() {
try{
String jsonDataString = readJsonDataDariFile();
JSONArray menuItemsJsonArray = new JSONArray(jsonDataString);
for(int i = 0; i<menuItemsJsonArray.length(); ++i){
JSONObject menuItemObject =menuItemsJsonArray.getJSONObject(i);
String txt_id_app = menuItemObject.getString("id_app");
String txt_title = menuItemObject.getString("masalah");
String txt_id = menuItemObject.getString("id");
String txt_keterangan = menuItemObject.getString("ket");
String txt_langkah = menuItemObject.getString("langkah");
item item = new item(txt_id_app,txt_id,txt_title,txt_keterangan,txt_langkah);
mRecyclerViewItems.add(item);
}
} catch (IOException | JSONException exception){
Log.e(guidesoftware.class.getName(),"Tidak BISA BUKA FILE JSON!",exception);
}
}
private String readJsonDataDariFile() throws IOException {
InputStream inputStream = null;
StringBuilder builder = new StringBuilder();
//menentukan konten
Intent intent = this.getIntent();
int position = intent.getExtras().getInt("POS_KEY");
int jsonlocation = 0;
//kondisi per lokasi
if(position == 0){
jsonlocation = R.raw.pemrograman_octave;
}else if(position == 1){
jsonlocation = R.raw.pemrograman_netbeans;
}else if(position == 2){
jsonlocation = R.raw.pemrograman_devcpp;
}else if(position == 3){
jsonlocation = R.raw.pemrograman_notepad;
}
try {
String jsonDataString = null;
inputStream = getResources().openRawResource(jsonlocation);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
while ((jsonDataString = bufferedReader.readLine()) != null){
builder.append(jsonDataString);
}
}finally {
if(inputStream != null){
inputStream.close();
}
}
return new String(builder);
}
@Override
public void onItemSelected(int position) {
Intent detailIntent = new Intent(this,fortest.class);
item clickeditem = (item) mRecyclerViewItems.get(position);
detailIntent.putExtra(EXTRA_MASALAH,clickeditem.getMasalah());
detailIntent.putExtra(EXTRA_KETERANGAN,clickeditem.getKet());
detailIntent.putExtra(EXTRA_LANGKAH,clickeditem.getLangkah());
startActivity(detailIntent);
}}
and here is my pemrogramanAdapter.java :
public class PemrogramanAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable{
private static final int MENU_ITEM_VIEW_TYPE = 0;
private final Context context;
private final List<Object> recyclerViewItem;
private List<Object> filterrecyclerViewItem;
private OnItemClickListener mListener;
public PemrogramanAdapter(Context context, List<Object> recyclerViewItem) {
this.context = context;
this.recyclerViewItem = recyclerViewItem;
this.filterrecyclerViewItem = recyclerViewItem;
}
public void setmListener(OnItemClickListener mListener) {
this.mListener = mListener;
}
public class MenuItemViewHolder extends RecyclerView.ViewHolder{
public TextView txt_title,txt_keterangan;
public ImageView txt_image;
public MenuItemViewHolder(View view){
super(view);
txt_title = (TextView)view.findViewById(R.id.title);
txt_keterangan = (TextView)view.findViewById(R.id.isi);
txt_image = (ImageView)view.findViewById(R.id.avatar);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mListener != null){
int position = getAdapterPosition();
if(position != RecyclerView.NO_POSITION){
mListener.onItemSelected(position);
}
}
}
});
}
}
@Override
public int getItemCount() {
return recyclerViewItem.size();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
switch (i){
case MENU_ITEM_VIEW_TYPE:
default:
View menuItemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_layout,viewGroup,false);
return new MenuItemViewHolder(menuItemLayoutView);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
int viewType = getItemViewType(position);
switch (viewType){
case MENU_ITEM_VIEW_TYPE:
default:
MenuItemViewHolder menuItemViewHolder = (MenuItemViewHolder) holder;
item menuItem = (item) recyclerViewItem.get(position);
menuItemViewHolder.txt_title.setText(menuItem.getMasalah());
menuItemViewHolder.txt_keterangan.setText(menuItem.getKet());
menuItemViewHolder.txt_image.setImageResource(R.drawable.pemrog_netbeans);
}
}
public interface OnItemClickListener{
void onItemSelected (int position);
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String searchString = charSequence.toString();
if(searchString.isEmpty())
filterrecyclerViewItem = recyclerViewItem; //for se kembalikan item yg di search ke semula
else{
List<Object> resultList = new ArrayList<>();
for(Object data : recyclerViewItem)
{
item item = new item();
if(item.getMasalah().toLowerCase().contains(searchString.toLowerCase() ))
resultList.add(item);
}
filterrecyclerViewItem = resultList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = filterResults;
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults filterResults) {
filterrecyclerViewItem = (ArrayList<Object>)filterResults.values;
notifyDataSetChanged();
}
};
}
}
i want to make the filter search works on my jsonObject in app_detail.java